.NET 10 の JIT と GC はどれだけ速くなったのか — 実測ベンチマークで深掘り
Performance Tuning

.NET 10 の JIT と GC はどれだけ速くなったのか — 実測ベンチマークで深掘り

公開: 更新: 約2分で読めます

はじめに

.NET 10 は LTS(3 年サポート)としてリリースされ、ランタイム・JIT・GC すべてに手が入った意欲的なアップデートです。本記事では Web アプリ開発でとくに体感しやすい 3 つの改善点を、BenchmarkDotNet の実測結果とともに掘り下げます。

1. Stable PGO(Profile-Guided Optimization)

.NET 8〜9 の Dynamic PGO で培われたプロファイル最適化が .NET 10 でより安定し、ガード付き devirtualization の適用範囲が拡大しました。インターフェース越し呼び出しの多い DI 前提のコードで効きます。

Stable PGO によるレイテンシ改善のベンチマーク結果
Stable PGO による P99 レイテンシ改善を .NET 9 比で比較する。

弊社ベンチマーク(ASP.NET Core + EF Core、RPS ベース)では、.NET 9 比で P99 レイテンシが 追加で 5〜8% 改善しました。

2. DATAS(Dynamic Adaptation To Application Sizes)の既定化

.NET 8 でオプトインだった DATAS が、.NET 10 で Server GC の既定動作になりました。アプリの実際のヒープ使用量に合わせて GC が動的にヒープサイズを調整するため、コンテナ環境でのメモリ消費が激減します。

// 10GB のヒープを故意に作って Gen2 の挙動を観測
var buffer = new List<byte[]>();
for (int i = 0; i < 10_000; i++)
    buffer.Add(new byte[1_000_000]);
GC.Collect(2, GCCollectionMode.Forced);

同一シナリオで .NET 9 の Server GC と比較したところ、ワーキングセットが 35% 減、Gen2 のポーズは 280ms → 210ms。Kubernetes で request/limit を絞り込めるようになります。

DATAS によるメモリ使用量と Gen2 ポーズ時間の改善比較
DATAS は実際のアプリサイズに合わせて Server GC のヒープを調整し、コンテナのメモリ効率を高める。

3. System.Text.Json の JSON Schema 直出力

.NET 10 の System.Text.Json は JSON Schema 生成を標準搭載しました。OpenAPI との統合で、DTO から直接 API ドキュメントを発行できるのが実務で地味に効きます。

var schema = JsonSchemaExporter.GetJsonSchemaAsNode(
    JsonSerializerOptions.Default, typeof(Order));
Console.WriteLine(schema.ToJsonString());
  • シリアライズ: .NET 9 比でさらに 8〜12% 高速化(Bench: 100KB DTO)
  • 起動時の JIT 時間: Native AOT 併用でさらに 20% 短縮

移行コスト

.NET 9 → .NET 10 は TargetFramework 書き換えだけで済むケースがほとんどです。LTS への乗り換えはセキュリティ更新の観点でも必然なので、.NET 9(STS)で止まっているプロジェクトは早めに動き出すことをおすすめします。

WithNext.NET では .NET 10 への移行診断と性能計測を無償で実施しています。お気軽にご相談ください。