2

大規模なアプリケーション(つまり、数MBのDLLを必要とするもの)がある場合、2回目は1回目よりもはるかに高速にロードされることに多くの人が気付いていると思います。アプリケーションで大きなファイルを読み取る場合も同じことが起こります。初めて使用した後は、はるかに速く読み取られます。

これに何が影響しますか?これはハードドライブキャッシュであるか、OSが独自のメモリキャッシュを追加していると思います。

大規模なアプリケーションやファイルの読み込み時間を短縮するために、どのような手法を使用していますか?

前もって感謝します

:質問はWindowsに関するものです

追加:OSのキャッシュサイズに影響するものは何ですか?一部のアプリでは、ファイルの読み込みが1分ほど後に再び遅くなるため、キャッシュが1分でいっぱいになりますか?

4

8 に答える 8

9

これには2つの影響があります。1つは、ハードディスクのキャッシュです(影響がほとんどないディスクと、影響が大きい傾向のあるOSによって実行されます)。2つ目は、Windows(およびその他のOS)は、他の何かのためにメモリが必要でない限り、DLLの使用が終了したときにDLLをアンロードする理由がほとんどないということです。これは、DLLをプロセス間で簡単に共有できるためです。

そのため、DLLは、それを使用していたアプリケーションが消えた後でも、ぶらぶらする習慣があります。別のアプリケーションがDLLが必要であると判断した場合、DLLはすでにメモリ内にあり、プロセスのアドレス空間にマップする必要があります。

一部のアプリケーションが必要なDLL(通常はQuickStartと呼ばれ、MSOfficeとAdobeReaderの両方がこれを行うと思います)をプリロードして、認識されるロード時間を改善するのを見てきました。

于 2009-02-18T09:33:27.633 に答える
2

一見の価値があるかもしれない1つの項目は「リベース」です。各DLLには、メモリにロードすることを好むプリセットの「ベース」アドレスがあります。アプリケーションが別のアドレスにDLLをロードしている場合(優先アドレスが使用できないため)、DLLは新しいアドレスにロードされ、「リベース」されます。大まかに言えば、これはdllの一部がその場で更新されることを意味します。これは、.NET vm .dllとは対照的に、ネイティブイメージにのみ適用されます。

この本当に古いMSDNの記事は、リベースをカバーしています: http ://msdn.microsoft.com/en-us/library/ms810432.aspx

それの多くがまだ当てはまるかどうかはわかりません(非常に古い記事です)...しかし、ここに魅力的な引用があります:

複数の小さなDLLよりも1つの大きなDLLを優先します。オペレーティングシステムがDLLを非常に長く検索する必要がないことを確認してください。また、オペレーティングシステムによってDLLがリベースされる可能性がある場合は、多くの修正を避けてください(または、リベースが起こりそうにないようにベースアドレスを選択してみてください)。

ところで、.NETを扱っている場合は、app / dllを「ngen'ng」することで処理速度を上げることができます(ngen = natve imagegeneration)。

于 2009-02-20T22:22:45.727 に答える
1

はい、ハードドライブから読み込まれたものはすべてキャッシュされるため、2回目の読み込みが速くなります。基本的な前提は、HDからの大量のデータを一度だけ使用してから破棄することはめったにないということです(これは通常、実際には適切な前提です)。最近のハードドライブにキャッシュ機能が組み込まれているかどうかはわかりませんが、通常、キャッシュを実装するのはオペレーティングシステム(カーネル)であり、RAMのチャンクを使用します。(私はかつて学術プロジェクトとして小さなカーネルを作成しました。メモリへのHDデータのキャッシュはその機能の1つでした)

于 2009-02-18T09:28:23.480 に答える
1

アセンブリを NGEN 処理すると、起動時間が短縮される可能性がありますが、実行時間が影響を受ける可能性があります (NGed コードは、OnDemand コンパイル コードほど最適ではない場合があります)。

NGENing はバックグラウンドでも実行できます: http://blogs.msdn.com/davidnotario/archive/2005/04/27/412838.aspx

これは別の良い記事です NGen and Performance http://msdn.microsoft.com/en-us/magazine/cc163808.aspx

于 2009-02-23T13:11:31.673 に答える
1

プログラムの起動時間に影響を与えるもう 1 つの要因は、Windows XP で導入された (私が信じている) テクノロジである Superfetch です。基本的に、プログラムの起動中にディスク アクセスを監視し、ファイル アクセス パターンを認識し、必要なデータを「まとめて」アクセスを高速化しようとします (たとえば、ロード順序に従ってディスク上のデータを順番に並べ替えるなど)。

他の人が述べたように、一般的に言えば、読み取り操作はWindowsディスクキャッシュによってキャッシュされ、他の操作にメモリが必要でない限り再利用される可能性があります。

于 2009-02-18T10:02:41.387 に答える
0

システム キャッシュは、ディスクから取得されるすべてのものに使用されます。これにはファイルのメタデータが含まれているため、多数のファイルを開くアプリケーション (ディレクトリ スキャナーなど) を使用している場合、大量のメモリを消費するアプリケーションも実行している場合は、キャッシュを簡単にフラッシュできます。

私が使用するものについては、少数の大きなファイル (>64 MB から 1 GB) と非同期の非バッファー I/O を使用することを好みます。そして、たまには古き良きデフラグ。

于 2009-02-20T16:42:37.433 に答える