用于fread / fwrite的最佳缓冲区大小


10

通过POSIX fread / fwrite函数应该为读取/写入文件选择什么缓冲区大小?

c 

这个问题太局限了。它仅与您当前正在编码的任何特定程序有关。
世界工程师

我的意思是一般情况。许多程序需要读取/写入大小非常未知的整个文件(例如)grepcp

您是指POSIX read/ write函数还是ANSI / ISO / IEC fread/ fwrite函数?
Jan Hudec

Answers:


6

ANSI / ISO fread/fwrite函数被缓冲。缓冲区通常为8 KiB,并且其粒度独立于您在代码中使用的粒度。稍微增加缓冲区可能有意义,也许增加到下面的值。对于批量传输,由于额外的副本,它们总是会稍微慢一点。

对于POSIX read/write功能,它取决于操作系统和设备以及许多其他因素,但是实际经验是,通过将缓冲区增加到超过几十KiB,您不会获得任何性能改进,因此32或64 KiB大约是正确的。

在某些系统上,依赖性大于在其他系统上。在Linux上,差异通常在8 KiB以上是最小的(因此默认缓冲区很好),例如在Windows CE(使用本机API;它们没有POSIX)甚至大于64 KiB仍然有帮助。它也可能取决于设备。


所以8K用于缓冲的I / O(即freadfwrite)和无缓冲32 / 64K?如果发送图像数据,是否有选择缓冲或不缓冲的特定理由?
Francesco Boi

1
@ FrancescoBoi,8k仅是您可以更改的缓冲的默认设置。缓冲的目的是避免在一次处理几个字节时进行所有上下文切换。对于图像,您通常需要或拥有所有图像,然后不进行缓冲会更好,因为它会跳过一些处理。
Jan Hudec
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.