我正在读取二进制文件,这是一个示例:
public static byte[] ReadFully(Stream input)
{
byte[] buffer = new byte[16*1024];
int read;
while ((read = input.Read(buffer, 0, buffer.Length)) > 0)
{
......
}
}
显然,缓冲区大小(16 * 1024)对性能起着很大的作用。我已经读到它取决于I / O技术(SATA,SSD,SCSI等),还取决于该文件上存在的分区的片段大小(我们可以在格式化分区时定义)。
但是这里有一个问题:是否有任何公式或最佳实践来定义缓冲区大小?现在,我正在基于反复试验进行定义。
编辑:我已经在服务器上使用不同的缓冲区大小测试了该应用程序,并且使用4095 * 256 * 16(16 MB)获得了最佳性能!4096慢4秒。
以下是一些较旧的帖子,它们非常有帮助,但我仍然无法找到原因:
“ .NET的顺序文件编程模式和性能”是有关I / O性能改进的精彩文章。
在此PDF文件的第8页中,它表明大于8个字节的缓冲区大小的带宽是恒定的。考虑到本文是在2004年编写的,硬盘驱动器是“ Maxtor 250 GB 7200 RPM SATA磁盘”,其结果应该与最新的I / O技术有所不同。
如果您正在寻找最佳性能,请查看pinvoke.net或PDF文件的第9页,非缓冲文件性能测量显示出更好的结果:
在无缓冲的I / O中,磁盘数据直接在应用程序的地址空间和设备之间移动,而无需任何中间复制。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句