.NET 11 から、フレームワークは x86-64-v1 ベースラインを必要とするものなど、現代的な命令セットを欠く古いハードウェアでは動作しなくなります。この移行により、すべてのオペレーティングシステムにおいて最小要件が x86-64-v2 に変更されます。この変更は、Windows 11 などの現代的なオペレーティングシステムのハードウェア要件に合わせ、レガシープロセッサのサポートに伴う複雑さを軽減することを目的としています。
ハードウェア要件の近代化
.NET 11 ランタイムは、x86/x64 および Arm64 アーキテクチャにおいて、現代的な命令セットを優先するように最小ハードウェア要件を更新します。x86/x64 システムでは、ベースラインが v1 から v2 に移動し、CX16、POPCNT、SSE3、SSSE3、SSE4.1、SSE4.2 といった命令セットのサポートが保証されます。

この画像は、ハードウェア近代化セクションで説明されている特定のハードウェアベースラインのシフトと命令セットの要件を例示しています。
HN Digestによる図表(learn.microsoft.comの報告数値に基づく)。数値はソースの表記通りです。
Arm64 アーキテクチャでは、この更新により Windows および Linux における LSE (Large System Extensions) 命令セットの新しい要件が導入されます。特に Windows に関しては、ReadyToRun (R2R) ターゲットが armv8.2-a + RCPC に更新され、OS によって公式にサポートされているハードウェアの大部分をカバーしています。
「最小ベースラインの更新は、コードベースのメンテナンスの複雑さを軽減し、基盤となるオペレーティングシステムの文書化された(そしてしばしば強制される)ハードウェア要件とより良く一致させるために行われました。」
— What's new in .NET 11 runtime
ランタイムネイティブなAsyncへの移行
.NET 11 における重要なアーキテクチャの転換は、「Runtime Async V2」の導入です。この機能は、非同期タスクを処理するためにコンパイラがステートマシンクラスをエミットする従来のモデルから脱却します。代わりに、ランタイム自体が非同期の実行、中断、および再開を追跡します。

このスクリーンショットは、コンパイラ生成のステートマシンに代わる「Runtime Async V2」機能の具体的な例を提供します。
この変更により、ライブ実行中に実際のメソッドがコールスタックに直接表示されるため、よりクリーンなスタックトレースが生成されます。また、デバッガーがコンパイラ生成のインフラにジャンプすることなく await 境界をステップ実行できるため、デバッグの容易性が向上します。ランタイムライブラリ自体もこの機能が有効な状態でコンパイルされており、アプリケーション全体のスムーズな移行が可能になります。
パフォーマンスと最適化の利点
新しい Runtime Async モデルには、タスクを返す同期メソッドの JIT コンパイル専用バージョンなど、いくつかのパフォーマンス最適化が含まれています。JIT はまた、コードサイズを削減するために非同期の中断ポイントをテールマージし、非同期処理の多いコードにおけるアロケーション圧力を軽減するために継続(continuation)をキャッシュします。
さらに、ランタイムは継続処理において復元すべきものが何もないことを検出し、ExecutionContext のキャプチャ/復元サイクルをスキップするようになりました。これにより、特に AsyncLocal 値を控えめに使用し、ConfigureAwait(false) を呼び出すアプリケーションにおいて、高スループットパスのオーバーヘッドが削減されます。
メンテナンスと互換性のトレードオフ
Microsoft は、より高いハードウェアベースラインへの移行により、使用される可能性の低い古いハードウェアのサポートを排除することで、コードベースの複雑さを軽減すると述べています。これはまた、AOT ターゲットの「共通の最小公約数」を定義するのに役立ち、最も古い命令セットにデフォルトで戻る必要を避けることでパフォーマンスを向上させることができます。
しかし、この変更により、.NET 11 をターゲットとするアプリケーションは古い CPU では実行できなくなり、CPU にベースライン命令セットが不足している旨のメッセージが表示される可能性があります。ReadyToRun が可能なアセンブリについては、新しい期待されるサポートを満たさない一部のサポート済みハードウェアにおいて、追加の起動オーバーヘッドが発生する場合があります。
Hacker Newsの読者の反応
- 技術的な指摘: あるコメント投稿者は、decimal の処理における特定の変更を指摘し、0.1 の値が .NET 10 と比較して .NET 11 で異なる表現になることを指摘しました。 コメント ↗
- 技術的な指摘: あるユーザーはランタイム async サポートに驚きを表明し、スタックトレースの改善を期待していた一方で、この変更が同等のパフォーマンスを維持できることに感銘を受けたことを述べています。 コメント ↗
- 技術的な指摘: あるコメント投稿者は、ランタイム async の基礎となる実装に関するオープンな質問を提起し、それがスタックフルコルーチンの使用を意味するのかを尋ねました。 コメント ↗
- 技術的な指摘: あるコメント投稿者は、.NET 11 が Standard Term Support リリースであることを明確にし、実際には .NET 10 よりもサポート期間が短いことに言及しました。 コメント ↗
Hacker Newsのスレッドで出た意見の要約です。事実として検証されたものではありません。 議論の全文を読む ↗