Windows XP在C++中启动时读取文本文件的速度较慢;预取

Windows XP slower to read text files at startup in C++; prefetch?

本文关键字:速度 文件 预取 取文本 读取 XP C++ 启动 Windows      更新时间:2023-10-16

我有一个用C++编写的应用程序,Visual Studio 2005仅在Windows XP中运行。启动应用程序时,它会读取大量(>20000)包含XML的文本文件(.info)。每个文件为800字节。

当应用程序在冷重启后启动时,读取文件需要10分钟。然而,如果我关闭它并重新启动它,只需要10秒钟就可以阅读它们。如果我进行热重启,也需要10秒。如果我使用cacheset实用程序清除缓存,读取文件也需要10秒。如果我冷重启电脑,2小时内不要触摸电脑,启动应用程序,仍然需要10分钟才能启动。

我使用标准库(std)中的基本函数来打开/读取/关闭文件。

我相信问题不是直接来自应用程序的实现,而是来自Windows XP。

我目前关注的是WindowsXP的预取器。我的应用程序在预取目录中有一个.pf文件。但是,我的.info文本文件都不在要预取的文件列表中。例如,在与Internet Explorer关联的预取文件中,您可以看到其临时文件(如图片)列在预取文件内。我相信,如果我能强迫我的文件出现在该列表中;对它们的打开/读取操作会更快,因为Windows已经知道它们在哪里了定位在磁盘上。

为什么我的文件没有和我的DLL一起位于.pf预取文件中?文件出现在预取文件中的条件是什么?

这有道理吗?

我还想知道是否有一种方法可以强制Windows XP预取完整的目录或文件列表?

这是一种已经商业化的产品,与电脑一起销售。因此,我们完全可以调整操作系统。然而,我们不打算对我们的申请进行极端的修改。

问候

IMO,如果您在启动时读取了>20000个文件,那么这肯定是应用程序的问题
为什么有人更喜欢调整操作系统而不是真正修复他们的应用程序,我无法理解。

如果超过20000个文件需要10分钟,那么您将看到<每个文件30毫秒,这对于旋转磁盘来说并不是很糟糕,尤其是如果您使用的是标准C++文件例程,IIRC有相当大的开销。

当需要10秒(每个文件0.5毫秒)时,这是因为文件已经在系统磁盘缓存中。

即使你让它工作,预取也不会神奇地让事情变得更快;操作系统仍然需要查找、打开、读取和关闭>20000个文件,以分钟为顺序进行。

提高加载时间的最佳方法是将文件捆绑在一起,并一次读取所有文件
为了最大限度地提高效率,请将它们保存在压缩档案中
或者使用固态硬盘。