18章メモリ効率

 「7章 オブジェクトの生存期間」で説明したように、CLRはガベージコレクタ(GC)のおかげで自動的にメモリ管理を行えます。しかし、これには代償が伴います。CPUがガベージコレクタに時間をかけると、より生産性の高い処理の進行を妨げます。ノートパソコンやスマホでは、GCはバッテリーを消費します。CPUの消費時間に基づいて費用が発生するクラウドコンピューティング環境では、CPUでの余計な処理は直接コスト増につながります。さらに細かいことを言えば、多くのコアを備えたコンピュータでGCに時間を費やしすぎると、スループットが劇的に悪化します。コアの多くがブロックされ、GCが完了するのを待ってからでないと処理を進められないからです。

 ほとんどの場合、このような影響は小さいので目に見える問題は生じません。しかし、特定の種類のプログラムで負荷が高くなると、GCコストが実行時間全体の大半を占めるようになります。特に、比較的単純ですが繰り返しの多い処理を実行するコードの場合には、GCオーバーヘッドがスループットに大きな影響を与えることがあります。

 MicrosoftのASP.NET CoreチームはWebサーバフレームワークの性能向上に尽力していたので、初期バージョンではGCオーバーヘッドのためによく限界に直面しました。.NETアプリケーションがこの限界を超えられるようにするために、C# 7.2ではメモリ割り当て数を大幅に減らせるさまざまな機能を導入しました。割り当て数が少ないほどGCが回収するメモリブロック数も減るので、GCオーバーヘッドの削減に直接つながります。ASP.NET Core 3.0ではこのような機能を大々的に使い始めました。このバージョンでは全面的に性能が向上していますが、 ...

Get プログラミングC# 第8版 now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.