2015-11-11 40 views
5

NgenとRyuJITは.NET 4.6で完全に無関係なものです(特に異なる最適化手法とアルゴリズムを使用しています)?NgenとRyuJIT - 起動前に起動時にx64実行コードが最速になる

自分自身や冷たい/暖かい起動時間に気を使わない場合、最も速く(より最適化された)x64ネイティブコードが生成されますか?

長時間実行しているサーバーアプリケーションを実行しています。継続的な実行フェーズは、パフォーマンス面で非常に重要です。スタートアップ段階は、私たちにとっては重要ではありません。これまでは.NET 4.5を使用しており、Ngenによるネイティブイメージを常に生成していました。 現在、.NET 4.6へのアップグレード中です。これにより、継続的な実行フェーズのパフォーマンスが低下しないようにしたいと考えています。私は、RyuJITがJITing時間を改善するのに最適な情報をいくつか読んだが、引用されたコードはNgenと比較してあまり最適化されていない可能性がある。 this github comment on one of the RyuJIT bugs

答えて

10

NGenとRyuJITの違いは十分ありません。彼らは非常に異なるジョブを実行し、プロセスが実行されている間は、事前にNGenのjitsとRyuJITのjitsを実行します。しかし、NGenは独自のジッタを持っていないので、RyuJITに仕事を請うように求めている。生成されたマシンコードは根本的に異なるものではありません。いくつかの最適化を行うことはできませんが、NGEN-edコードはやや遅くなります。

技術的には、オプティマイザはコードの解析に時間を費やし、可能な限り最適な最適化を見つけるために、NGenを使用することができます。しかしMicrosoftはこれを利用していません。彼らがなぜ彼らの1-800のサポート電話番号と関係があるのか​​を完全にクリスタルではありません。コード最適化は常にコード生成の最も危険な部分であり、既存のジッタのバグは常に最適化のバグです。これはいつか変わるかもしれないということは想像もできません。

.NETネイティブを活用すると、先に進むことができます。 C++コンパイラのバックエンドでコードを事前に生成します。しかし、現時点では、確かに来て、それはパッケージ化されたアプリケーションでのみサポートされています。 Windows Storeを通じて提供される種類のものは、Store、Phone、またはUniversalをターゲットにして、展開車両としてStoreを使用する必要があります。このパッケージは、.NETネイティブの作業を行う上で非常に重要です。コードを翻訳する必要があることがわかります。そしてそれは正しいことを得るためにはまだしばしば助けを必要とします。反射は解決するのが難しい問題です。あなたがあなたのマシンに持っている理由です。 NGenについても同じ問題が存在しないことに注意してください。まだ、ジッタに依存して、コードをin-timeにする必要があります。反射ターゲットコードとジェネリックスのように。これはいつか変わるかもしれないということは想像もできません。

前述のように、NGenコードはわずかに遅くなります。あなたが暖かいスタートの遅れに気にしないなら、あなたはNGenを使いたくありません。

最後に、RyuJITはではありません。は、以前のバージョンよりも高速なコードを生成します。これはすでに最適化のための非常にまともな仕事をしました。あまりにもまともです。 RyuJITプロジェクトは、コードベースでかなり基本的であり、劇的なリライトでしか解決できなかったレガシーx64ジッタの問題を修正し始めました。最適化はそのうちの1つであり、その時間に費やす時間の上限はありませんでした。大規模な方法で非常に不合理な時間を与える。だから、最後のオンスを絞ってRyuJITを意図的に無効にしたいのであれば、それはレガシーx64ジッタに戻ってしまうはずです。

+0

ハンスは、.NET JITのコード品質を高く評価しています。 – usr

+0

@Hans Passant非常に詳細な回答をありがとう! 「NGenコードは少し遅いです。」 - 起動時のフェーズ(ディスク上の追加ファイルが検出され、メモリに読み込まれる必要があるため)だけでなく、他の理由もありますか?あなたが私の記事を読んでいる - – Jan

+0

@usr - 残念ながら、私たちも、最初の実行(しかしNGENはまだはるかに信頼性が、この中でJITプロファイルが移動するための方法かもしれません)迅速な実行しなければならないコードのいくつかのクリティカルパス(オーダー送信)を持っています灰色のメガネ。賞賛??私は.NETネイティブをスキップしませんでした。 –

関連する問題