2

何十万ものレコードを処理する必要があるアプリケーションがあります。現在、一度に処理できるのは 500 個までです。各バッチは、処理/分析に最大 5 分かかる場合があります (合計約 10 時間の処理)。500 レコードという制限の理由は、メモリの消費です。私たちのプログラムが大量のメモリを消費する主な理由の 1 つは、リストや辞書のサイズを設定していないことだと思います (たとえば、new List(100000) の代わりに new List())。コレクションのサイズを設定するための変更を行って、.NET が余分な容量を持つ新しいリストの作成とコピーを停止するようにしました。

これが私の質問です。プログラムのバージョンがよりメモリ効率的であることを証明するにはどうすればよいですか? 確認する必要があるパフォーマンス カウンターはありますか? ツール?モニタリング?

4

5 に答える 5

3

.net アプリケーションのメモリ管理とメモリ リークを詳細に分析できる.net メモリ プロファイラなどのツールがあります。

.NET Memory Profiler は、メモリ リークを検出し、C#、VB.NET、またはその他の .NET 言語で記述されたプログラムのメモリ使用量を最適化するための強力なツールです。プロファイリング ガイド、自動メモリ アナライザー、専用のトラッカーを利用して、プログラムにメモリやリソースのリークがないこと、およびメモリの使用が可能な限り最適であることを確認できます。

于 2012-07-07T04:52:57.660 に答える
2

プロファイラーが、あるバージョンが他のバージョンよりもどれだけ効率的であるかについての実際の概要を提供するとは思いません。

これを行うには、メモリ パフォーマンス カウンターを使用することをお勧めします。perfmonアプリの両方のバージョンに対して、 を使用していくつかのデータ収集セッションをセットアップできます。

最初はプロセスメモリのみを監視する必要があります(もちろん、プロセスの)。残りのシステム メモリ パフォーマンス カウンターをいくつか追加して、プロセスの有効期間中に全体的な仮想メモリの状態がどのように変化するかを確認することもできます。

違いがあり、それでも概要と結論がうまく得られない場合は、.NET CLR メモリ パフォーマンス カウンターを調べてみることができます。私が言及した前のものほど分析するのは簡単ではありませんが、はるかに詳細です。

アプリで長時間の処理が行われることを考えると、適切なデータを取得するには、各セッションを 1 時間か 2 時間実行する必要があります。

于 2012-07-07T06:51:57.073 に答える
1

Visual Studio Ultimate をお持ちの場合は、組み込みのパフォーマンス プロファイラー ツールを使用できます: Debug -> Start Performance Analysis。これが利用できない場合は、JetBrains のdotTraceを使用して同じことを行うことができます。

Stopwatchクラスを使用して実行時間を測定することもできます。ストップウォッチは、特に経過時間を測定するように設計されており、DateTime.Now と比較して、基礎となる高周波ハードウェア タイマーを使用して、(ハードウェアで利用可能な場合) 優れた粒度/精度を提供する場合があります。Stopwatch クラスを使用して 2 つの実行時間を比較すると、どちらが速く実行されているかがわかります。これは、CPU またはメモリ使用量に関する情報を提供しません。

于 2012-07-07T06:43:34.400 に答える
1

大量のメモリを使用しても、実際のメモリが不足してスワップファイルを使用し始めるまで、通常は実際に速度が低下することはありません。アプリの実行中にタスクマネージャーで確認できます。アプリのメモリのピーク時と動作量も確認できます。

どのオブジェクトがメモリを占有しているかを確認するために、少しプロファイリングします (利用可能なメモリ プロファイラがいくつかあります)。

リストに関しては; リストの容量を設定しても問題が解決するとは思いません。List クラスは、容量を 2 倍にすることで大きくなります (ドキュメントが見つからなかったため、テスト済みです)。最悪の場合、2 倍のメモリを使用しています。新しいリストを大量に作成する場合は、オブジェクト キャッシュを作成してリストを再利用できます。しかし、私の経験 .NET では、ランタイムが非常に効率的であるため、これは .NET ではあまり役に立ちません。

于 2012-07-08T08:46:32.490 に答える
0

CLR GC ETL イベントを使用できます。Microsoft から perfview をダウンロードし、その下でアプリケーションを実行してから、GC ページを確認してください。

「合計メモリ割り当て」と「GC で費やされた時間」を確認するだけで、マネージド メモリがどのように使用されているかがわかります。

詳細が必要な場合は、CLR 割り当てティック イベントを確認してください。

Perfview では、マネージド ヒープのライブ オブジェクトを分析することもできます。

于 2012-07-16T20:04:50.143 に答える