2012-02-17 132 views
2

我有一个应用程序是用C++,Visual Studio 2005专门在Windows XP中运行的。 当应用程序启动时,它读取大量(> 20000)包含XML的文本文件(.nfo)。 每个文件是800bytes。Windows XP在C++启动时读取文本文件速度较慢;预取?

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

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

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

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

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

这是否有意义?

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

这是已经商品化的产品,与电脑一起出售。因此,我们完全可以调整操作系统。 但是,我们并没有计划对我们的应用程序进行极端改动。

问候

+0

应用程序如何启动?你是手动运行它还是启动组,注册表等的一部分?我不确定哪个版本的操作系统,但有些“沙盒”启动程序有助于启动时间,因为许多供应商希望他们的程序同时启动。 – 2012-02-17 14:24:15

+0

通常用户手动启动应用程序!我们正在自动启动,但我不明白它可以如何帮助.. – philouuuu 2012-02-17 14:31:07

+0

从std的基本功能你的意思是ifstream对象?在处理大量文本时,普通C函数应该有更好的性能。 – Raven 2012-02-17 14:39:56

回答

4

IMO,如果你正在读> 20000个文件在启动时,这绝对与应用程序的问题。
为什么有人宁愿调整操作系统来实际修复他们的应用程序是超出我的。

如果需要10分钟> 20000页的文件,你看每个文件< 30毫秒,这是不坏的旋转盘,特别是如果你使用标准的C++文件例程,其中有相当多的开销,IIRC。

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

即使你得到它的工作,预取不会神奇地使事情变得更快;操作系统仍然需要查找,打开,读取和关闭> 20000个文件,其中以分钟为单位。

提高加载时间的最佳方法是将文件捆绑在一起并一次读取。
为了达到最高效率,请将它们粘贴在压缩存档中。
或使用SSD。