硬盘读取的性能问题

时间:2009-09-29 18:16:15

标签: c++ performance winapi disk

我有一个C ++程序,它从硬盘中读取文件并对文件中的数据进行一些处理。我使用标准的Win32 API来读取文件。我的问题是这个程序有时非常快,然后突然减慢到之前速度的1/6。如果我在多次运行中一次又一次地读取相同的文件,那么通常第一次运行将是最慢的。然后它保持速度,直到我读取其他一组文件。所以我明显的猜测是分析磁盘访问时间。我使用了perfmon实用程序并测量了我的程序的IO读取字节数/秒。正如预期的那样,读取的字节数存在巨大差异(约5倍)。我的问题是:

(1)。操作系统(在我的情况下是Windows)是否将最近读取的文件缓存到某处,以便后续加载更快?

(2)。如果我可以保证我读取的所有文件都位于同一目录中,那么有什么方法可以将它们放在硬盘中以便我的磁盘访问时间更快?

我能为此做点什么吗?

7 个答案:

答案 0 :(得分:8)

1)Windows会将最近读取的文件缓存到内存中。这本书Windows Internals包含了对其工作原理的精彩描述。 Windows的现代版本也使用名为SuperFetch的技术,该技术将尝试根据使用历史预先将磁盘内容提取到内存中,而ReadyBoost可以缓存到闪存驱动器,从而实现更快的随机访问。所有这些都将提高初始运行后从磁盘访问数据的速度。

2)目录确实不会影响磁盘上的布局。对驱动器进行碎片整理会将文件数据组合在一起。 Windows Vista on up将自动对磁盘进行碎片整理。理想情况下,您希望执行大型顺序读取并最小化写入。小的随机访问和带有读取的交错写入会严重损害性能。您可以使用Windows Performance Toolkit来分析磁盘访问。

答案 1 :(得分:8)

您的编号问题似乎已经得到了解答。如果您仍然想知道如何提高硬盘读取速度,请参考以下提示:

  • 如果可能,请阅读OS功能(例如ReadFile)而不是包装库(如iostreamsstdio)。许多包装器引入了更多级别的缓冲。
  • 按顺序阅读,让Windows知道您将使用FILE_FLAG_SEQUENTIAL_SCAN标志按顺序阅读。
  • 如果您只是要阅读(而不是写作),请务必打开文件进行阅读。
  • 读取块,而不是字节或字符。
  • 理想情况下,块应该是磁盘簇大小的倍数。
  • 以群集对齐的偏移从光盘中读取。
  • 在页面边界读取内存。 (如果你要分配一个大块,它可能是页面对齐的。)
  • 高级:如果您只是在读取文件的开头后就可以开始计算,那么您可以使用重叠的I / O来尽可能地并行化计算和后续读取。

答案 2 :(得分:3)

是的,Windows(以及大多数现代操作系统)最近将文件数据保存在其他未使用的RAM中,以便在不久的将来再次请求该文件数据时,它已经可以在RAM中使用,并且可以避免磁盘访问。

就更快地进行磁盘访问而言,您可以尝试对驱动器进行碎片整理,但我不希望它有太多帮助。与RAM访问相比,驱动器访问速度很慢,这就是RAM缓存提供如此好的加速的原因。

答案 3 :(得分:2)

作为诊断测试,您能否准确测量第一次加载所需的时间?

然后用它来确定转移率。然后,您可以获取该传输速率,并将其与运行HD Tune时获得的速率进行比较。对于它的价值,我自己运行它,并且我的Western Digital RE3驱动器(可用的7200 RPM SATA驱动器之一)的最小速度为44.2 MB / s,平均速度为87 MB / s,最大读取速度为110 MB / s。 p>

所有这一切的要点是看看你自己的应用程序是否能够做到最好。换句话说,除了缓存之外,您无法以比硬盘驱动器能力更快的速度读取文件。所以,如果你达到了这个限制,那么就没有其他事可做了。

答案 4 :(得分:2)

另外,请确保测试期间内存不足。运行perfmon并监控内存>可用字节和物理磁盘>您正在阅读的物理驱动器的磁盘读取字节数/秒。监控过程'I / O也是一个好主意。请记住,后者结合了所有I / O(包括网络)。

对于来自单个平均SATA驱动器的顺序读取,您应该期望50 MB / s。一些好的条纹串行SCSI驱动器将为您提供大约220 MB / s。如果您看到可用内存接近零,那将是您的问题。如果它在您完成第一轮阅读后保持不变,那么它与您的应用程序有关。

答案 5 :(得分:1)

名为contig的Microsoft实用程序可用于对磁盘上的单个文件进行碎片整理或创建新的未分段文件。

答案 6 :(得分:0)

对于疯狂的回答,您可以尝试格式化驱动器,以便将信息放在最快的部分,看看是否有帮助。

Tom's Hardware已就如何做到这一点进行了审核。

相关问题