ServerGCとWorkStationGC
NET 共通言語ランタイム (CLR) には、サーバーとワークステーションの 2 つの GC モードが存在します。ServerGC と呼ばれるサーバー用のモードは、マルチプロセッサ コンピュータ上で拡張性のあるスループットを提供するように最適化されています。一方、WorkStationGC と呼ばれるワークステーション用のモードは、インタラクティブなアプリケーションのコレクションの停止時間を削減するように最適化されています。
という説明は何度も見ていますが、具体的にどう嬉しいのかイマイチ分かっていません。
試しにマルチコア環境で以下のコードを実行してみると、
using System; using System.Threading; using System.Runtime; using System.Diagnostics; class Program { const int LOOP = 1000000; static void Main() { Console.WriteLine (GCSettings.IsServerGC); Stopwatch sw = new Stopwatch(); sw.Start(); Thread t = new Thread(new ThreadStart(delegate { byte b = null; for (int i = 0; i < LOOP; ++i) { b = new byte [1024]; } })); t.Start(); byte c = null; for (int i = 0; i < LOOP; ++i) { c = new byte [1024]; } t.Join(); sw.Stop(); Console.WriteLine (sw.ElapsedMilliseconds); Console.ReadLine(); } } /* True 921 False 345 */
WorkStationGCの方が圧倒的に速いです。もちろん、サンプルがしょぼいだけで実際のサーバー環境だとServerGCが役立つのかもしれませんが、サーバー用途の代表格であるASP.NETについてhttp://www.microsoft.com/japan/serviceproviders/technical/060718_9.mspxでは、
ServerGC は、プロセッサごとにヒープを作成して並行コレクションを行い、マルチプロセッサ コンピュータ上の GC パフォーマンスを向上させます。一方、WorkStationGC はヒープを 1 つだけ作成し、マルチプロセッサ コンピュータ上の GC パフォーマンスを犠牲にしてワーキング セットを削減します。複数の ASP.NET ワーカー プロセスをホストする場合、ServerGC を使用すると予想以上に多くのメモリが消費される場合があります。このようなシナリオでは、代わりに WorkStationGC を使用すると、スループットを多少減らすだけで、ホスト可能なワーカー プロセスを大幅に増やすことができます。
とあり、サーバー用途でも無条件にServerGCが良いとは言い切れません。いったい、どんなサンプルを書けばServerGCの良さが分かりますでしょうか?(^^;