最適化されたメモリ操作、マネージドC#コード(.net)用のSmartHeapに似たソリューションはありますか?
2 に答える
.NET ランタイムは、すべてのメモリ操作を処理します。メモリ アロケータをオーバーライドする方法はありません。オーバーライドすると、GC の動作が劇的に変化するためです。特に、コンパクト化を考慮するとそうです。
そうは言っても、メモリ プールは既に CLR によって "管理" されており、新しいオブジェクトを割り当てても必ずしも新しいオブジェクトがトリガーされるとは限らないため、.NET の世界ではオブジェクトの割り当てがはるかに安価であるため、これは .NET ではあまりメリットがない可能性があります。メモリ (通常は、既に割り当てられているメモリをクリアして使用するだけです)。
SmartHeapの名声は、15年前から確かに覚えていますが、ヒープロックの競合を回避できるということです。管理対象プログラムのヒープは、ネイティブプログラムで使用されるヒープとあまり共通点がなく、SmartHeapのような製品は確かに役に立ちません。
しかし、同じ種類のロックが設定されています。ネイティブコードほど問題ではありません。ガベージコレクションされたヒープからのヒープ割り当ては非常に高速で、ポインタの増分にすぎません。ネイティブヒープアロケータは、断片化を回避するためにさらに多くの作業を行う必要があります。したがって、2つ以上の管理対象スレッドがまったく同時に割り当てる可能性はそれほど高くありません。
それにもかかわらず、まったく異なる理由で、.NETCLRは複数のヒープをサポートします。この機能は、サーバーバージョンのWindowsで自動的に有効になります。app.exe.configファイルの<gcServer>
要素を使用して、意図的にオンにすることができます。副作用として、ロックの競合が非常に少なくなります。本当の目的は、複数のスレッドで同時にガベージを収集することです。
オンにして、目立った違いがあるかどうかを確認できます。インタラクティブなUIのようなプログラムでは、より多くのメモリを消費し、ガベージコレクションの一時停止が目立つ場合があることに注意してください。バックグラウンドコレクションはサーバーGCでは使用できません。.NET4.5で使用できるようになります