はじめに
.NET 10 は LTS(3 年サポート)としてリリースされ、ランタイム・JIT・GC すべてに手が入った意欲的なアップデートです。本記事では Web アプリ開発でとくに体感しやすい 3 つの改善点を、BenchmarkDotNet の実測結果とともに掘り下げます。
1. Stable PGO(Profile-Guided Optimization)
.NET 8〜9 の Dynamic PGO で培われたプロファイル最適化が .NET 10 でより安定し、ガード付き devirtualization の適用範囲が拡大しました。インターフェース越し呼び出しの多い DI 前提のコードで効きます。
弊社ベンチマーク(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 を絞り込めるようになります。
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 への移行診断と性能計測を無償で実施しています。お気軽にご相談ください。
