【发布时间】:2011-03-03 07:17:20
【问题描述】:
我正在编写一个小型 I/O 库来协助一个更大的(爱好)项目。该库的一部分对文件执行各种功能,通过FileStream 对象读取/写入。在每个StreamReader.Read(...) 传递中,
我触发了一个事件,该事件将在主应用程序中用于显示进度信息。循环中进行的处理是多种多样的,但不会太耗时(例如,它可能只是一个简单的文件副本,或者可能涉及加密......)。
我的主要问题是:使用的最佳内存缓冲区大小是多少?考虑物理磁盘布局,我可以选择 2k,这将覆盖一个 CD 扇区大小,并且是 512 字节硬盘扇区的一个很好的倍数。在抽象树的更高层,您可以选择更大的缓冲区,一次可以读取整个 FAT 簇。我意识到,对于今天的 PC,我可以选择更消耗内存的选项(例如,几个 MiB),但随后我会增加 UI 更新之间的时间,并且用户会感觉到应用程序的响应速度较慢。
顺便说一句,我最终希望为托管在 FTP/HTTP 服务器上的文件(通过本地网络/fastish DSL)提供类似的接口。对于那些来说,最好的内存缓冲区大小是多少(同样,感知响应能力与性能之间的“最佳情况”权衡)?
【问题讨论】:
-
我原以为操作系统或 Windows 会维护自己的硬件功能和速度配置文件,并提供一项服务,为给定的存储量和活动推荐最佳缓冲区大小(例如随机读取/writes vs 顺序读/写) - 这将消除猜测。
标签: c# optimization file size buffer