時期尚早の最適化の危険性はコメントに記載されているので、ここで何が起こっているかのセマンティクスについて説明します。
記事が指摘しているようにConcurrentQueue
、 はすでにそれを通過したいくつかの参照を保持できます。私はそれを「数ダース」と学びましたが、記事にはそれが 31 以下であると書かれています。キューが 2000x2000 ビットマップのような大きなオブジェクトを追跡している場合、理論的には問題になる可能性があります。もちろん、プログラムの残りの部分が何をしているかによって異なります。
StrongBox<T>
唯一のことStrongBox
は他の何かへの参照を保持することであるため、それを a でラップすると役立ちます。したがって、 a のStrongBox
フットプリントは非常に小さく、それが保持するものはすべて範囲外になり、(理論的には) より迅速に GC されます。
ダイエットソーダのすべての内容を持っているのでStrongBox
、あなたはその使用法を考えすぎています. 文字通り、Value
フィールドにいくつかT
をロードして、後で参照するだけです。次のようになります。
var boxedBitmap = new StrongBox<Bitmap>(new Bitmap(1,1));
var bitmap = boxedBitmap.Value;
または、次のようにします。
var boxedBitmap = new StrongBox<Bitmap>();
boxedBitmap.Value = new Bitmap(1,1);
var bitmap = boxedBitmap.Value;
真剣に、Reflector で開くと、このクラスの実装は 5 行のようになります。
この場合、 の使用法はConcurrentQueue<T>
の使用法とまったく違いはありませんConcurrentQueue<StrongBox<T>>
。.Value
リソースを宛先スレッドに送信する前に、追加するだけです。これは、私が働いていた会社が、ツール全体を渡すのではなく、決定論的ツールへの参照を渡すだけで、大規模なマルチスレッド分析サービスのメモリインプリントをかなり削減するのに役立ちましたが、マイレージは異なる場合があります-明確ではありません何かを変更して別のものに使用するために渡した場合、どのような影響があるかについて。