我有一个 C++ 程序,它从硬盘读取文件并对文件中的数据进行一些处理。我正在使用标准 Win32 API 来读取文件。我的问题是这个程序有时速度非常快,然后突然减慢到之前速度的 1/6。如果我在多次运行中一次又一次地读取相同的文件,那么通常第一次运行将是最慢的一次。然后它会保持速度,直到我读取其他一些文件集。所以我的明显猜测是分析磁盘访问时间。我使用 perfmon 实用程序并测量了程序的 IO 读取字节/秒。正如预期的那样,读取的字节数存在巨大差异(约 5 倍)。我的问题是:
(1).操作系统(在我的例子中是Windows)是否将最近读取的文件缓存在某处,以便后续加载速度更快?
(2)。如果我可以保证我读取的所有文件都位于同一目录中,那么有什么方法可以将它们放置在硬盘中,以便我的磁盘访问时间更快?
为此我能做些什么吗?
1)Windows确实将最近读取的文件缓存在内存中。这本书Windows 内部结构 https://rads.stackoverflow.com/amzn/click/com/0735625301包括对其工作原理的精彩描述。现代版本的 Windows 还使用一种名为 SuperFetch 的技术,该技术将尝试根据使用历史记录抢先将磁盘内容提取到内存中,而 ReadyBoost 可以缓存到闪存驱动器,从而实现更快的随机访问。所有这些都将提高初始运行后从磁盘访问数据的速度。
2)目录确实不影响磁盘上的布局。对驱动器进行碎片整理会将文件数据分组在一起。 Windows Vista 及以上版本将自动对您的磁盘进行碎片整理。理想情况下,您希望进行大量顺序读取并最小化写入。小规模随机访问以及交错写入和读取会严重损害性能。您可以使用Windows 性能工具包 http://msdn.microsoft.com/en-us/performance/default.aspx来分析您的磁盘访问。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)