【要約】.NET 11 Runtime Async はなぜ速いのか [Qiita_Trend] | Summary by TechDistill
> Source: Qiita_Trend
Execute Primary Source
// Problem
C#開発者がasync/awaitを利用する際、非同期処理のオーバーヘッドが性能の足かせとなる問題がある。コンパイラがメソッド単位でステートマシンを生成するため、以下の課題が生じる。
- ・中断しないメソッドでもTask生成やステートマシンのコストが強制される。
- ・JITが呼び出しチェーンを最適化できず、インライン化が困難になる。
- ・頻繁なメモリ割り当てがGC負荷を増大させる。
// Approach
.NETチームは、コンパイラではなくランタイム(JIT)に非同期制御を任せるRuntime Asyncを採用した。新しいAsync Calling Conventionを導入し、以下の手法で解決を図る。
- ・戻り値とContinuationをレジスタ経由で直接受け渡す。
- ・中断しない場合は、通常の同期メソッドと同様のレジスタ渡しで実行する。
- ・中断時のみ、最小限の状態をContinuationオブジェクトに保存する。
// Result
.NET 11のデイリービルドを用いた検証により、Runtime Asyncは劇的な性能向上を示した。
- ・中断しない非同期処理で、従来比約20倍の高速化を達成。
- ・中断しない場合のメモリ割り当てを0バイトに削減。
- ・深い呼び出しチェーンにおいて、最大7.4倍の高速化を実現。
Senior Engineer Insight
> 「Pay for play」の真の実現といえる。中断しない非同期処理のコストをほぼゼロに抑える設計は、高負荷な分散システムにおいて極めて強力だ。特に、呼び出しチェーンが深い設計において、累積的なオーバーヘッドを劇的に削減できる点は、スケーラビリティの観点から高く評価できる。開発者は、パフォーマンスを意識しすぎることなく、自然な非同期コードを書けるようになるだろう。