如何通过调整缓冲区大小来优化读写?

2023-11-29

如何优化标准 C++/C++11 中 std::ifstream 和 std::ofstream 的读写速度(无 POSIX 函数)? (1

我不太清楚缓冲区的作用,所以你能确认一下吗:

  • 用于读取:文件的很大一部分被预加载到内存中(因此缓冲区大小定义了这大部分的大小)(2)
  • 用于写入:数据写入内存中,一旦缓冲区已满,数据就会从内存传输到文件系统 (3)

如何设置 std::ifstream 和 std::ofstream 的缓冲区大小? (4)

考虑到我使用非常大的二进制文件(几个 10 GB),并且文件系统通常最适合大型读/写,我可以定义大约 100 MB 的缓冲区大小吗?如果它会降低性能,为什么? (5)

最后,默认缓冲区是否“智能”,因为 ifstream/ofstream 将检测您正在读取/写入文件的数据量并调整缓冲区大小以提供最大速度? (6)


AFAICS,您对缓冲如何工作的描述是正确的。

不过,大于 1 MB 的缓冲区不太可能给您带来任何好处。事实上,最佳点可能远低于该值。请注意,使用的缓冲区std::ifstream and std::ofstream与磁盘缓存无关——这是内核的工作,它自行决定。流缓冲区仅影响通过一个系统调用传入或传出内核的最大字节数。因此,理想的缓冲区大小doesn't取决于您传输的数据量。什么是does取决于是

  1. 系统调用的开销。更高的开销意味着您需要一次性传输更多数据。
  2. 缓冲区管理的开销成本。如果有的话,对于更大的缓冲区来说可能更大。
  3. CPU 缓存抖动影响。威尔强烈支持较小的缓冲区。

由于 (1) 有利于较大的缓冲区,而 (2) 和 (3) 有利于较小的缓冲区,因此在某个地方会有一个最佳点。由于 CPU 缓存大小可能为几兆字节左右,因此接近该限制的缓冲区大小将导致severe(3) 的效果,因此最佳点肯定在 1 MB 左右以下。您可能可以忽略 (2),因此仍然需要估计 (1) 以获得缓冲区大小的下限。假设系统调用的成本约为 1000 个周期左右,并假设 CPU+内存的原始复制速度为 4 字节/周期。传输 4k 数据的成本大约与执行一次系统调用的成本相同。因此,缓冲区大小为 20k 时,系统调用开销约为 20%,缓冲区大小为 100k 时,系统调用开销约为 4%。因此,理想的缓冲区大小在几百 kB 范围内独立的文件大小!

您可能可以相信您的标准库实现能够做到这一点,除非分析为您提供了确凿的证据表明存在is影响性能的缓冲问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何通过调整缓冲区大小来优化读写? 的相关文章

  • 代码 GetAsyncKeyState(VK_SHIFT) & 0x8000 中的这些数字是什么?它们是必不可少的吗?

    我试图在按下按键的简单动作中找到这些数字及其含义的任何逻辑解释 GetAsyncKeyState VK SHIFT 0x8000 可以使用哪些其他值来代替0x8000它们与按键有什么关系 GetAsyncKeyState 根据文档返回 如果
  • ComboBox DataBinding 导致 ArgumentException

    我的几个类对象 class Person public string Name get set public string Sex get set public int Age get set public override string
  • 为什么在 WebApi 上下文中在 using 块中使用 HttpClient 是错误的?

    那么 问题是为什么在 using 块中使用 HttpClient 是错误的 但在 WebApi 上下文中呢 我一直在读这篇文章不要阻止异步代码 https blog stephencleary com 2012 07 dont block
  • 从同一个类中的另一个构造函数调用构造函数

    我有一个带有两个构造函数的类 C 这是代码片段 public class FooBar public FooBar string s constructor 1 some functionality public FooBar int i
  • File.AppendText 尝试写入错误的位置

    我有一个 C 控制台应用程序 它作为 Windows 任务计划程序中的计划任务运行 此控制台应用程序写入日志文件 该日志文件在调试模式下运行时会创建并写入应用程序文件夹本身内的文件 但是 当它在任务计划程序中运行时 它会抛出一个错误 指出访
  • 类型约束

    我有以下类层次结构 class Header IEnumerable
  • 使用valgrind进行GDB远程调试

    如果我使用远程调试gdb我连接到gdbserver using target remote host 2345 如果我使用 valgrind 和 gdb 调试内存错误 以中断无效内存访问 我会使用 target remote vgdb 启动
  • 如何在 Qt 应用程序中通过终端命令运行分离的应用程序?

    我想使用命令 cd opencv opencv 3 0 0 alpha samples cpp cpp example facedetect lena jpg 在 Qt 应用程序中按钮的 clicked 方法上运行 OpenCV 示例代码
  • IQueryable 单元或集成测试

    我有一个 Web api 并且公开了一个端点 如下所示 api 假期 name name 这是 Web api 的控制器 get 方法 public IQueryable
  • 为什么这个二维指针表示法有效,而另一个则无效[重复]

    这个问题在这里已经有答案了 这里我编写了一段代码来打印 3x3 矩阵的对角线值之和 这里我必须将矩阵传递给函数 矩阵被传递给指针数组 代码可以工作 但问题是我必须编写参数的方式如下 int mat 3 以下导致程序崩溃 int mat 3
  • 保护 APK 中的字符串

    我正在使用 Xamarin 的 Mono for Android 开发一个 Android 应用程序 我目前正在努力使用 Google Play API 添加应用内购买功能 为此 我需要从我的应用程序内向 Google 发送公共许可证密钥
  • 使 Guid 属性成为线程安全的

    我的一个类有一个 Guid 类型的属性 该属性可以由多个线程同时读写 我的印象是对 Guid 的读取和写入不是原子的 因此我应该锁定它们 我选择这样做 public Guid TestKey get lock testKeyLock ret
  • WebBrowser.Print() 等待完成。 。网

    我在 VB NET 中使用 WebBrowser 控件并调用 Print 方法 我正在使用 PDF 打印机进行打印 当调用 Print 时 它不会立即启动 它会等到完成整个子或块的运行代码 我需要确保我正在打印的文件也完整并继续处理该文件
  • C++ new * char 不为空

    我有一个问题 我在 ASIO 中开发服务器 数据包采用尖头字符 当我创建新字符时 例如char buffer new char 128 我必须手动将其清理为空 By for int i 0 i lt 128 i buffer i 0x00
  • OpenGL:仅获取模板缓冲区而没有深度缓冲区?

    我想获取一个模板缓冲区 但如果可能的话 不要承受附加深度缓冲区的开销 因为我不会使用它 我发现的大多数资源表明 虽然模板缓冲区是可选的 例如 排除它以利于获得更高的深度缓冲区精度 但我还没有看到任何请求并成功获取仅 8 位模板缓冲区的代码
  • 将数组作为参数传递

    如果我们修改作为方法内参数传递的数组的内容 则修改是在参数的副本而不是原始参数上完成的 因此结果不可见 当我们调用具有引用类型参数的方法时 会发生什么过程 这是我想问的代码示例 using System namespace Value Re
  • 使用 C 在 OS X 中获取其他进程的 argv

    我想获得其他进程的argv 例如ps 我使用的是在 Intel 或 PowerPC 上运行的 Mac OS X 10 4 11 首先 我阅读了 ps 和 man kvm 的代码 然后编写了一些 C 代码 include
  • 为boost python编译的.so找不到模块

    我正在尝试将 C 代码包装到 python 中 只需一个类即可导出两个函数 我编译为map so 当我尝试时import map得到像噪音一样的错误 Traceback most recent call last File
  • 如何减少具有多个单元的 PdfPTable 的内存消耗

    我正在使用 ITextSharp 创建一个 PDF 它由单个 PdfTable 组成 不幸的是 对于特定的数据集 由于创建了大量 PdfPCell 我遇到了内存不足异常 我已经分析了内存使用情况 我有近百万个单元格的 1 2 在这种情况下有
  • OpenCV SIFT 描述符关键点半径

    我正在深入研究OpenCV的SIFT描述符提取的实现 https github com Itseez opencv blob master modules nonfree src sift cpp 我发现了一些令人费解的代码来获取兴趣点邻域

随机推荐

  • 有没有办法在 linq 查询中参数化方法?

    在我使用 Linq to SQL 的应用程序中 用户可以搜索文本 可以在搜索表达式的开头和 或结尾使用星号 现在的代码是这样的 var search SearchTextBox Text Trim bool filterStartsWith
  • 读取串行输入并打印到 Tkinter GUI

    我正在尝试制作一个基于 Tkinter 的 GUI 用于 Arduino 打印传感器值并响应用户输入 我试图用来消除 while 循环的代码是这样的 它不打印任何传感器信息 唯一的输出是 正在尝试 dev ttyACM0 然后打开 tkin
  • 获取 .bat 文件中的图像文件尺寸

    我有一个bat文件 列出了文件夹中所有图像的路径 代码是 echo off break gt infofile txt for f delims F in dir b s bmp do echo F 1 1 1 100 100 gt gt
  • 如何在 nginx 中包含位置块?

    我在用着nginx作为 2 个网络应用程序的反向代理 这两个网络应用程序 UI 共享位置代理 因为后端服务是共享的 如何组合位置块并将它们包含在服务器中 主机配置文件 server server name app1 com listen 8
  • 加密加密属性文件中的密码

    Problem 我正在使用 Apache CXF 3 0 7 并在新功能您可以在加密属性文件中存储密钥库密码的 BASE 64 编码 加密版本 但我不知道如何添加它 我没有找到此实现的示例 在 apache web 中说 加密属性文件内容的
  • 为什么 NULL = NULL 在 SQL Server 中计算结果为 false

    在 SQL Server 中 如果你有nullParam NULL在 where 子句中 它的计算结果始终为 false 这是违反直觉的 给我带来了很多错误 我确实明白IS NULL and IS NOT NULL关键字是正确的方法 但为什
  • 如何解决 Multer 错误:意外的表单结束?

    我发现了有关 Multer 的其他类似问题 但没有答案 我正在尝试使用 next js 前端 和 node js 后端 上传文件 使用开发工具时 数据是通过网络选项卡发布的 以下是我的设置 app js const express requ
  • iOS 6.0 MPMoviePlayerController 全屏模式黑色?然后应用程序不再阻止任何操作

    当屏幕为黑色时 MPMoviePlayerController 视频将进入全屏模式 然后该应用程序就被屏蔽了 此问题仅适用于 iOS 6 0 但 iOS 5 1 运行良好 这是我的代码 如果我双击播放器全屏打开 但显示黑屏 self mov
  • PHP 数组语法:array(...) 或 [...] [关闭]

    Closed 这个问题是基于意见的 目前不接受答案 在 PHP 中 这些相同吗 x 1 2 3 and x array 1 2 3 这两种创建数组的方法是否存在不同的情况 有什么理由使用其中一种而不是另一种吗 它们与警告相同 x 1 2 3
  • 在 Access 中从另一个表的数据创建一个表

    这个问题是关于 MS Access 的 我想做的是 我在 Access 中有一个表 并且想使用第一个表中的数据创建另一个表 希望通过一些 VBA 代码自动创建 有关于如何执行此操作的任何建议吗 我对 VBA 和 Access 很陌生 因此任
  • Web API:具有不同 HTTP 动词的相同方法

    在 WEB API 控制器中 我们可以使用相同的方法名称和不同的 HTTP 动词吗 HttpGet public string Test return Success Get HttpPost public string Test int
  • 正则表达式多个条件

    我有一个包含 URL 的字符串 例如https xxxx yyyy com en 我怎样才能制作一个正则表达式来验证这一点both这些条件都满足吗 网址不包含xxxx The URL does包含任一 en or en 您可以使用 xxxx
  • 重定向选择框中的选择选项

    目前我正在使用这个
  • 合并具有大写和非大写版本的变量名称的列,而不指定变量名称

    我有一个 大 数据框 如下所示 library data table DT lt fread ID country year A b B a 4 NLD 2002 NA 1 NA 0 5 NLD 2002 NA 0 NA 1 6 NLD 2
  • 接近恒定时间旋转,不违反标准

    我花了很长时间试图想出一个不违反 C C 标准的恒定时间旋转 问题是边缘 角落情况 其中操作在算法中调用并且这些算法无法更改 例如 以下内容来自Crypto 并执行下面的测试工具海湾合作委员会乌桑 i e g fsanitize undef
  • 如何使用 Java prefuse 库创建条形图?

    我目前有prefuse绘制散点图 其中 X 轴是计算机名称 Y 轴是其温度 如何让它绘制显示值而不是离散点的条形 我目前正在使用以下代码来呈现点 ShapeAction shape new ShapeAction group Constan
  • 如何过滤大于x的数组值

    我一直在互联网上查找 但找不到任何介绍如何解决此问题的帖子 尽管我确信这是一个非常简单的修复 基本上我有一个包含数字值的数组 我想过滤掉任何大于 10 的数字并将它们添加到另一个数组中 这是到目前为止我所得到的 但我得到的是第一个数组中的所
  • 如何从 QUnit 测试触发本机 Javascript 事件?

    我正在开发一个不依赖于 jQuery 的 Javascript 库 尽管我的测试中可以使用 jQuery 和 QUnit 在库中 我按照 jQuery 的方式将事件附加到元素 if document addEventListener tab
  • 如何使用水豚has_text

    所以现在我已经让黄瓜 水豚 硒点击谷歌应用程序脚本 这很棒 但由于某种原因 我似乎无法按照我期望的方式检查页面正文中的文本 在调试器中 我可以抓取页面对象 我可以在浏览器中获得预期的文本 直接扫描html显示文本出现了两次 但是page h
  • 如何通过调整缓冲区大小来优化读写?

    如何优化标准 C C 11 中 std ifstream 和 std ofstream 的读写速度 无 POSIX 函数 1 我不太清楚缓冲区的作用 所以你能确认一下吗 用于读取 文件的很大一部分被预加载到内存中 因此缓冲区大小定义了这大部