2026-09-16 dotnetdotnet-11jit .NET 11 の JIT がジェネリック仮想メソッドを非仮想化し、アロケーションも一緒に消える Stephen Toub の Performance Improvements in .NET 11 では、ジェネリック仮想メソッド呼び出しが 6.7 ns / 24 バイトから 1.8 ns / アロケーションゼロまで下がっています。3 本の RyuJIT のプルリクエストが、.NET で最も不透明だったディスパッチのインライン化を可能にしました。
2026-09-04 dotnetnative-aotjit .NET の W^X フラグとは何か、Native AOT はそれを必要とするのか? W^X (write xor execute) は、いかなるメモリページも書き込み可能と実行可能を同時に満たさないという規則です。.NET では DOTNET_EnableWriteXorExecute というノブとして公開され、.NET 7 以降は既定で有効で、その存在理由はもっぱら JIT にあります。Native AOT はこのノブを一度も読みません。ランタイムがどう実装しているか、何を犠牲にするか、そして無効化が正当な対処になるのはどんなときかを解説します。
2026-07-11 dotnetperformancejit .NET の PGO とは何か、そして有効化する必要はあるのか? PGO(プロファイルに基づく最適化)は、.NET の JIT がワークロードで実際に通る型や分岐に合わせてホットなコードを特化させる仕組みです。Dynamic PGO は .NET 8 以降デフォルトで有効なので、.NET 8 以降では有効化する必要はありません。PGO が何をするのか、その効果をどう確認するのか、そして設定に手を入れる数少ないケースを解説します。
2026-07-11 dotnetperformancejit 階層型コンパイルとは何か、どう捉えればよいのか? 階層型コンパイルは、.NET の JIT に各メソッドを2回コンパイルさせます。まずアプリを起動させるために高速かつ未最適化で、次にランタイムがメソッドをホットだと認識した時点で完全な最適化を施して再度コンパイルします。本記事では tier 0、tier 1、オンスタック置換、Dynamic PGO がどう組み合わさるか、そしてそれらをどう観測し調整するかを解説します。
2026-04-19 dotnetdotnet-11jit RyuJIT が .NET 11 Preview 3 でさらに bounds check を刈り込む: index-from-end と i + 定数 .NET 11 Preview 3 は RyuJIT に連続した index-from-end アクセスと i + 定数 < length パターンで冗長な bounds check を除去することを教え、タイトなループでの分岐圧力を削減します。