文件I / O与stream – 最佳的内存缓冲区大小
我正在写一个小的I / O库来协助一个更大的(爱好)项目。 该库的一部分对文件执行各种function,通过FileStream
对象读取/写入。 在每个StreamReader.Read(...)
传递中,
我发布了一个将在主应用中使用的事件来显示进度信息。 在循环中进行的处理是有效的,但不是太耗时(例如,它可能只是一个简单的文件副本,或者可能涉及encryption…)。
我的主要问题是:什么是最好的内存缓冲区大小使用? 考虑物理磁盘布局,我可以select2k,这将覆盖CD扇区大小,是512字节硬盘扇区的好几倍。 在抽象树的上方,你可以select一个更大的缓冲区,一次读取整个FAT簇。 我意识到今天的个人电脑,我可以去寻找更多的内存饥饿的选项(例如几个MiB),但是随后我增加了UI更新之间的时间,并且用户感觉到响应性较差的应用程序。
另外,我最终希望提供一个类似的FTP / HTTP服务器上的文件(通过本地networking/快速的DSL)的接口。 什么是最好的内存缓冲区大小(再次,感知响应性能与性能之间的“最佳情况”权衡)?
文件已被文件系统caching缓冲。 您只需select不会强制FileStream的缓冲区大小,以使本机Windows ReadFile()API调用太频繁地填充缓冲区。 千万不要低于千字节,超过16 KB会浪费内存,对CPU的L1caching (通常为16或32 KB的数据)不友好。
4 KB是一个传统的select,尽pipe这只是偶然地跨越虚拟内存页面。 这很难描述; 您将最终测量读取caching文件需要多长时间。 如果数据在高速caching中可用,则以RAM速度运行,每秒5GB。 它将在第二次运行testing时在caching中,而且在生产环境中不会经常发生。 文件I / O完全由磁盘驱动器或NIC占主导地位,速度慢,复制数据是花生。 4 KB将正常工作。
当我通过stream对象直接处理文件时,通常使用4096字节。 在多个I / O区域(本地文件系统,局域网/ 中小企业networking,networkingstream等)似乎是相当有效的,但我还没有分析它或任何东西。 回想起来的时候,我看到几个例子使用这个大小,而且卡住了我的记忆。 这并不意味着这是最好的。
“这取决于”。
你将不得不用不同的缓冲区大小来testing你的应用程序来确定whis是最好的。 你不能提前猜测。