5

この答えはユーザーのマシンに依存すると確信していますが、データのピン留めに関するベストプラクティスがいくつかあるはずです。

それぞれ 1.048.576 バイトを含む 5 つのバイト配列を保持する必要があります。通常、私はGCHandle(管理された) メモリを使用することを好みますが、GC が遅くなると言う人もいます。それが起こる可能性があることは知っていますが、実際にGCに影響を与えるには、どのくらいのメモリ/オブジェクトを固定する必要がありますか?

私が持っているオプションは次のとおりです。

  1. GCHandle.Alloc GCHandleType.Pinned(管理)。GCが遅くなりますか??
  2. Marshal.AllocHGlobal(管理されていないアクセス)。安全でないコード
  3. a を使用しBitmapて、Scan0 (管理されていないアクセス) にデータを保持します。安全でないコード
4

1 に答える 1

5

これは絶望的に答えられない質問です。ピン留めされたオブジェクトは GC をそれほど遅くしません。GC がヒープを圧縮するとき、それは道路上の岩にすぎません。ヒープの固定されたセクションをスキップするだけで、その岩を簡単に回避できます。

さらに悪い結果は、コレクションの完了後に実行されるコードに永続的な影響を与えることです。ヒープが十分に圧縮されていないため、参照の局所性が低くなり、プロセッサは CPU キャッシュからそれほど多くのマイレージを取得できません。スローダウンが不可能であることを定量化すると、後で実行されるコードの種類に大きく依存します。次のGCまで、それが悪化し、しばらく続くということだけです。

唯一の良いアドバイスは、固定する必要がある場合はできるだけ短時間で固定することです. また、オブジェクトが固定されているにコレクションが発生する可能性があるシナリオを回避するため。これは、大まかに言えば、ピンを保持している間はメモリを割り当てないようにすることを意味します。プログラムが複数のスレッドを実行している場合は必ずしも実用的ではなく<gcServer>、.config ファイル内の要素が魅力的です。これは、より多くのメモリを使用するが、スレッドに独自の GC ヒープ セグメントを与える別の GC 戦略を選択します。これを行うタイミングを決定するための簡単なガイダンスはありません。現実的なデータ セットを使用したプロファイリングが必要です。

Marshal.AllocHGlobal も Bitmap も GC ヒープに顕著な影響を与えず、アンマネージ メモリ ヒープから割り当てます。

于 2013-06-11T13:36:19.540 に答える