2

C++ で記述されたアプリケーション、Visual Studio 2005 を Windows XP でのみ実行しています。アプリケーションが起動されると、XML を含む多数 (> 20000) のテキスト ファイル (.nfo) が読み取られます。各ファイルは 800 バイトです。

コールド リブート後にアプリケーションを起動すると、ファイルの読み取りに 10 分かかります。ただし、それを閉じて再起動すると、それらを読み取るのに 10 秒しかかかりません。ウォーム リブートを実行すると、10 秒かかります。cacheset ユーティリティを使用してキャッシュをクリアすると、ファイルの読み取りにも 10 秒かかります。コンピューターをコールド リブートした場合、コンピューターに 2 時間触れずにアプリケーションを起動しますが、それでも起動に 10 分かかります。

標準ライブラリ (std) の基本関数を使用して、ファイルを開いたり、読み取ったり、閉じたりします。

この問題は、アプリケーションの実装に直接起因するのではなく、Windows XP に起因すると考えられます。

私の現在の焦点は、Windows XP の Prefetcher にあります。私のアプリケーションには、プリフェッチ ディレクトリにある .pf ファイルがあります。ただし、プリフェッチするファイルのリストに .nfo テキスト ファイルがありません。たとえば、Internet Explorer に関連付けられているプリフェッチ ファイルでは、画像などの一時ファイルがプリフェッチ ファイルにリストされていることがわかります。私のファイルをそのリストに強制的に表示できればと思います。Windowsはディスク上のどこにあるかをすでに知っているため、それらのオープン/読み取り操作は高速になります。

ファイルが DLL と共に .pf プリフェッチ ファイルに配置されないのはなぜですか? ファイルがプリフェッチ ファイルに表示される条件は何ですか?

これは理にかなっていますか?

また、Windows XP に完全なディレクトリまたはファイルのリストを強制的にプリフェッチさせる方法があるかどうかも疑問に思っていました。

パソコンと一緒に販売されている商品化済みの商品です。したがって、OS を微調整するための完全なアクセス権があります。ただし、アプリケーションに極端な変更を加える予定はありません。

よろしく

4

1 に答える 1

4

IMO、起動時に20000を超えるファイルを読んでいる場合、それは間違いなくアプリケーションの問題です.
アプリケーションを実際に修正するよりも、OS を微調整することを好む人がいる理由は、私にはわかりません。

20000 個以上のファイルに 10 分かかる場合、ファイルあたり 30 ミリ秒未満であることがわかります。これは、回転ディスクにとってそれほど悪くはありません。特に、標準の C++ ファイル ルーチンを使用している場合はオーバーヘッド、IIRC。

10 秒 (ファイルあたり 0.5 ミリ秒) かかるのは、ファイルが既にシステム ディスク キャッシュにあるためです。

たとえそれが機能したとしても、プリフェッチによって魔法のように高速化されるわけではありません。OS は引き続き 20000 個を超えるファイルを探し、開き、読み取り、閉じる必要があり、これは数分かかります。

読み込み時間を改善する最善の方法は、ファイルをまとめて一度に読み取ることです。
最大限の効率を得るには、それらを圧縮アーカイブに貼り付けます。
または SSD を使用します。

于 2012-02-17T15:59:15.287 に答える