2

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

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

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

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

我目前的重点是 Windows XP 的 Prefetcher。我的应用程序有一个位于预取目录中的 .pf 文件。但是,我的 .nfo 文本文件都没有位于要预取的文件列表中。例如,在与 Internet Explorer 关联的预取文件中,可以看到其图片等临时文件都列在了预取文件中。我相信如果我可以强制我的文件出现在该列表中;对它们的打开/读取操作会更快,因为 Windows 已经知道它们在磁盘上的位置。

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

这有意义吗?

我还想知道是否有办法强制 Windows XP 预先获取完整目录或文件列表?

这是与计算机一起销售的已经商业化的产品。因此,我们拥有调整操作系统的完全权限。但是,我们不打算对我们的应用程序进行极端更改。

问候

4

1 回答 1

4

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

如果 > 20000 个文件需要 10 分钟,那么每个文件的速度小于 30 毫秒,这对于旋转磁盘来说还不错,尤其是在使用标准 C++ 文件例程时,它有相当多的开销,IIRC。

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

即使你让它工作了,预取也不会神奇地让事情变得更快。操作系统仍然需要查找、打开、读取和关闭超过 20000 个文件,这花费几分钟的时间。

改善加载时间的最佳方法是将文件捆绑在一起并一次读取它们。
为了获得最大效率,请将它们保存在压缩存档中。
或者使用 SSD。

于 2012-02-17T15:59:15.287 回答