如何优化标准 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取决于是
- 系统调用的开销。更高的开销意味着您需要一次性传输更多数据。
- 缓冲区管理的开销成本。如果有的话,对于更大的缓冲区来说可能更大。
- CPU 缓存抖动影响。威尔强烈支持较小的缓冲区。
由于 (1) 有利于较大的缓冲区,而 (2) 和 (3) 有利于较小的缓冲区,因此在某个地方会有一个最佳点。由于 CPU 缓存大小可能为几兆字节左右,因此接近该限制的缓冲区大小将导致severe(3) 的效果,因此最佳点肯定在 1 MB 左右以下。您可能可以忽略 (2),因此仍然需要估计 (1) 以获得缓冲区大小的下限。假设系统调用的成本约为 1000 个周期左右,并假设 CPU+内存的原始复制速度为 4 字节/周期。传输 4k 数据的成本大约与执行一次系统调用的成本相同。因此,缓冲区大小为 20k 时,系统调用开销约为 20%,缓冲区大小为 100k 时,系统调用开销约为 4%。因此,理想的缓冲区大小在几百 kB 范围内独立的文件大小!
您可能可以相信您的标准库实现能够做到这一点,除非分析为您提供了确凿的证据表明存在is影响性能的缓冲问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)