一尘不染

带流的文件I / O-最佳内存缓冲区大小

c#

我正在编写一个小型I /
O库,以协助进行较大的(业余)项目。该库的一部分对文件执行各种功能,该文件可通过FileStream对象进行读写。每次StreamReader.Read(...)通过

我触发了一个事件,该事件将在主应用中用于显示进度信息。循环中进行的处理非常复杂,但并不太耗时(例如,它可能只是简单的文件副本,或者可能涉及加密…)。

我的主要问题是:使用的最佳内存缓冲区大小是多少?考虑物理磁盘布局,我可以选择2k,它可以覆盖CD扇区的大小,并且是512字节硬盘扇区的整数倍。在抽象树的上层,您可以使用更大的缓冲区,该缓冲区可以一次读取整个FAT群集。我意识到在当今的PC上,我可以选择更多的内存需求(例如,几个MiB),但是随后我会增加UI更新之间的时间,并且用户会感觉到应用程序的响应速度较慢。

顺便说一句,我最终希望为FTP /
HTTP服务器(通过本地网络/快速DSL)托管的文件提供类似的接口。最佳的内存缓冲区大小是什么(再次,在感知的响应度和性能之间进行“最佳情况”权衡)?


阅读 436

收藏
2020-05-19

共1个答案

一尘不染

文件已被文件系统缓存缓冲。您只需要选择一个不会迫使FileStream进行本机Windows
ReadFile()API调用的缓冲区大小即可过多地填充缓冲区。不要低于1 KB,超过16
KB会浪费内存,并且对CPU的L1缓存(通常16或32 KB数据)不友好。

4 KB是传统的选择,即使只是偶然地完全跨越虚拟内存页面也是如此。很难描述;您将最终测量读取缓存文件所需的时间。如果缓存中有可用数据,则以5 GB
/秒和更高的RAM速度运行。它将在第二次运行测试时放入缓存中,而在生产环境中则不会经常发生。文件I /
O完全由磁盘驱动器或NIC所控制,并且速度缓慢,复制数据实在是小菜一碟。4
KB可以正常工作。

2020-05-19