RyuJITの紹介:.NET用の新しいJITコンパイラ

その結果、プログラムは常に32ビットのプログラムよりも高速または効率的に動作するとは限らないという事実にもかかわらず、世界は64ビットコンピューティングに向かっています。 多くの32ビットプログラムは、さまざまな理由で、64ビットプログラムよりも高速に実行できます。 そのような例の1つは、.NETフレームワーク用の64ビットJITコンパイラーです。 それはあなたのプログラムが非常に速く動作するように多くの仕事をしますが、悲しいかな、それは私たちが望むほど速くありません。 これが修正する予定です。 64ビットの.NETコードを2倍高速にコンパイルできる新世代のx64 JITコンパイラーの紹介。



x64について話す



32ビットx86コンピューターは非常に長い間使用されているようです。 これは1つの大きな問題を抱える素晴らしいアーキテクチャです。32ビットポインターのアドレス空間は4 GBに制限されます。 拡張ポインターを備えた64ビットコンピューターは、ほぼ無制限の量のデータに対処できます。 Windowsの最初のx64バージョンが登場したとき、RAMは比較的高価であったため、ほとんどの場合64ビットマシンがサーバーとして使用されていました。 現在、x64アーキテクチャが主流となっており、コンピューターは原則として少なくとも4 GBのRAMボリュームで出荷されています。 一部のスマートフォンでも、RAMが1 GBしかないにもかかわらず、64ビットプロセッサに切り替えています。

.NET x64 JITは、サーバー上で実行される長時間実行プロセス中に最も効率的なコードを生成するように設計されました。 これは、ILコードからマシンコードへの最速のコンパイル用に最適化された.NET x86 JITとの違いであり、プログラムの迅速な起動を保証します。 多くの場合、サーバーアプリケーションではコードパフォーマンスの最適化が正当化されます。 しかし、「サーバーアプリケーション」にはWebアプリケーションも含まれます。これは要件の1つが最も早い開始です。 .NETの現在のバージョンの64ビットJITには、ILコードの迅速なコンパイルがほとんどないため、多くのユーザーがNGenやバックグラウンドJITなどの他のテクノロジを使用する必要があります。



RyuJITが助けに!



リュウ何? .NETコード生成チームは現在、RyuJITというコードネームの新しいx64コンパイラの開発に取り組んでいます。 現在のバージョンの2倍の速度で動作します。 これは、彼によってコンパイルされたプログラムの起動時間が約30%短縮されることを意味します(JITコンパイルに費やされる時間は、アプリケーションの実行プロセスの一部にすぎないため、JITが2倍速く動作するという事実は、アプリケーションが同様に加速することを意味しません) さらに、新しいJITは依然として最も効率的なマシンコードを提供します。

以下のグラフは、RyuJITが現在のJIT64よりも高速であることを示しています。

画像

明らかに、すべての例は新しいJITでより速く機能しました。 おそらく、2番目の例(RFC822電子メールRegEx)が文字通りグラフを超えていることに気づいたでしょう。 これは、JIT64では正規表現が特にうまく機能しないためです。 この例をJIT64コンパイラでコンパイルするには60秒かかり、1.4 GBのメモリが必要でした。 RyuJITの場合、1.8秒と199 MBしかかかりませんでした。

Paint.NETの例がより一般的になりました。 テストマシンでのアプリケーションの実行は2.3秒から1.8秒に短縮されました。 コンパイル時間は1510ミリ秒から970ミリ秒に短縮されました。 メモリ使用量を最小限に抑えたクイックスタートは、私たちの世界をより良い場所にすることは明らかだと思います。



そして、デザートのために...



RyuJITが使用するパフォーマンスの向上とリソースの削減はもちろん素晴らしいことですが、それについて最も驚くべきことではありません。 JIT64が開発されたばかりのとき、ダイナミックコンパイルシナリオ用に最適化された当時の32ビットJITコンパイラーではなく、C ++コンパイラーからコマンド最適化の基盤を取ることにしました。 その後、ほとんどの64ビットコンピューターがサーバーとして使用されたため、コンパイラー自体のパフォーマンスを向上させるのではなく、コンパイルされたコードの品質に重点を置くことが重要でした。 その結果、.NET CodeGenチームは2つの異なるコンパイラーのコードを維持する必要がありました。 2つの場所で機能を追加し、バグを修正すると、イノベーションの導入が妨げられました。 また、近年のWindows Phone 8.0用のARMアーキテクチャとMDILの追加により、この作業はさらに困難になりました。

RyuJITは、x86 JITコードベースに基づいています。 一方、64ビットアーキテクチャでのみ機能します。 このアップグレードされたコンパイラーは、x86、ARM、MDIL、その他のすべてのJITコンパイラーの基盤になります。 共通のコードベースは、.NETアプリケーションが異なるプラットフォームで可能な限り同様に動作することを意味します。つまり、バグは異なるアーキテクチャで同じになります。 ただし、これは、新しいテクノロジーをより迅速に導入できることも意味します。



試してみるには何が必要ですか?



RyuJITのCTPバージョンが利用可能であり、今すぐテスト環境で試すことができます。 生産のサポートはまだありません。

RyuJITインストーラーを今すぐダウンロードできますが、 64ビットバージョンのWindows 8.1およびWindows Server 2012 R2でのみ機能します。 RyuJITはシステムのNGenに変更を加えないことに注意してください。インストールをクリーンにしたかったのです。 それでも、RyuJITをオンにした後、VSで「編集して続行」コードを記述している間、x64での動作は停止します。

インストール後、RyuJITを有効にする方法は2つあります。 特定の1つのアプリケーションでのみ有効にする場合は、環境変数「 COMPLUS_AltJit = * 」を追加します。 すべてのアプリケーションで有効にする場合は、レジストリ「 HKLM \ SOFTWARE \ Microsoft \ .NETFramework \ AltJit 」で文字列「*」を使用してキーを定義する必要があります。 これらのメソッドは両方とも、64ビットCLRがJIT64ではなくRyuJITを使用するように強制します。 さらに、これらの方法は両方とも可逆的です-RyuJITをインストールしても、コンピューター上の何も変更されません(ファイルをコンパイラディレクトリに配置する場合を除く)。



ソース: .NET Frameworkブログ

.NETコード生成チームのブログ



All Articles