4

VS2010 C# 並列プロファイリングの結果を理解するからの議論を続けますが、さらに要点を説明します。

小さなクラスに多くのメモリ割り当てを使用する (Parallel.For/Each を使用して) 並列で動作するスレッドが多数あります。

これにより、グローバル メモリ アロケータ スレッドで競合が発生します。

各スレッドにメモリ プールを事前に割り当て、このプールからすべての割り当てを行うように .NET に指示する方法はありますか?

現在、私の解決策は、メモリプール(スレッド間でリサイクルされるT型のオブジェクトのグローバルに割り当てられた配列)の独自の実装です。これは多くの助けになりますが、次の理由で効率的ではありません。

  1. 特定のメモリ スライスから割り当てるように .NET に指示することはできません。
  2. プールにメモリを割り当てるには、まだnewを何度も呼び出す必要があります。

ありがとう、
ハガイ

4

3 に答える 3

16

あなたが抱えていた同じ問題に対する答えを見つけようとして、2日間検索しました。答えは、ガベージ コレクション モードをサーバー モードに設定する必要があるということです。デフォルトでは、ガベージ コレクション モードはワークステーション モードに設定されています。ガベージ コレクションをサーバー モードに設定すると、マネージド ヒープが個別に管理されるセクション (CPU ごとに 1 つ) に分割されます。これを行うには、config 設定を app.config ファイルに追加する必要があります。

<runtime>
   <gcServer enabled="true"/>
</runtime>

私の 12 コア Opteron 6172 の速度差は劇的でした!

于 2011-06-06T12:00:28.363 に答える
0

一連のオブジェクトを事前に割り当てて、それらを個別のスレッド用のグループに保持できます。ただし、これではパフォーマンスが向上しない可能性があります。

ガベージ コレクタは、存続期間の短い小さなオブジェクトを効率的に処理するように特別に設計されています。オブジェクトをプールに保持すると、オブジェクトは存続期間が長くなり、ガベージ コレクションに耐えられます。これは、オブジェクトが第 2 世代のヒープにコピーされることを意味します。このコピーは、単に新しいオブジェクトを割り当てるよりもコストがかかります。

于 2010-05-26T14:21:26.130 に答える
0

ガベージ コレクターはメモリを割り当てません。

多くの小さな一時オブジェクトといくつかの長期オブジェクトを割り当てているように聞こえます.ガベージコレクターは一時オブジェクトのガベージコレクションに多くの時間を費やしているため、アプリはより多くのメモリをリクエストする必要はありません. OS。.NET Framework 4 Advanced Development - Garbage Collectionから:

マネージ ヒープでアドレス空間が使用可能である限り、ランタイムは新しいオブジェクトに空間を割り当て続けます。ただし、メモリは無限ではありません。最終的に、ガベージ コレクターは、一部のメモリを解放するためにコレクションを実行する必要があります。

解決策:小さな一時オブジェクトをたくさん割り当てないでください。ガベージ コレクションとパフォーマンスに関するページも役立つ場合があります。

于 2010-05-26T14:00:19.943 に答える