什么是理想的缓冲区大小?

Bar*_*uch 26 c c++ io

可能重复:
使用FileInputStream时如何确定理想的缓冲区大小?

当使用C++的istream系列read()或C 语言从文件(或任何输入流)读取原始数据时fread(),必须提供缓冲区,以及要读取的数据量.我见过的大多数程序似乎都在512到4096之间任意选择2的幂.

  1. 它是否有/应该是2的幂的原因,或者这只是程序员对2的幂的自然倾向?
  2. 什么是"理想"数字?"理想"我的意思是它会是最快的.我假设它必须是底层设备的缓冲区大小的倍数?或者可能是底层流对象的缓冲区?无论如何,我如何确定这些缓冲区的大小?而且,一旦我这样做,使用它的倍数会增加任何速度,而不是使用确切的大小?

编辑
大多数答案似乎是在编译时无法确定.我很高兴在运行时找到它.

rav*_*avi 19

消息来源:
使用FileInputStream时如何确定理想的缓冲区大小?

最佳缓冲区大小与许多因素有关:文件系统块大小,CPU缓存大小和缓存延迟.

大多数文件系统都配置为使用4096或8192的块大小.理论上,如果您配置缓冲区大小以便读取比磁盘块多几个字节,则使用文件系统的操作可能效率极低(即,如果您将缓冲区配置为一次读取4100个字节,每次读取将需要文件系统进行2次块读取.如果这些块已经在缓存中,那么你最终会支付RAM的价格 - > L3/L2缓存延迟.如果你运气不好而且这些块还没有在缓存中,那么你也需要支付磁盘 - > RAM延迟的价格.

这就是为什么您看到大多数缓冲区的大小为2的幂,并且通常大于(或等于)磁盘块大小.这意味着您的一个流读取可能会导致多个磁盘块读取 - 但这些读取将始终使用完整块 - 不会浪费读取.

确保这一点通常还会导致其他性能友好的参数影响读取和后续处理:数据总线宽度对齐,DMA对齐,内存高速缓存行对齐,整数虚拟内存页面.