JIT をオフにできるのに、なぜ JMH をベンチマークに使用する必要があるのだろうか? JMH は、JIT を無効にすることで防止できる最適化を抑制していませんか?
2 に答える
TL;DR; 同じトラックで自転車に乗ってフォーミュラ 1 のパフォーマンスを評価します。
特に単純なフォローアップの質問を自問する場合、この質問は非常に奇妙です。実稼働環境とは大幅に異なる条件でベンチマークを実行するポイントは何ですか? 言い換えれば、インタープリターモードで実行して得た知識は、現実の世界にどのように適用されるでしょうか?
ここでは、問題は白黒ではありません。現実の世界と同じように最適化を行う必要があり、適切な実験セットアップを作成するには、慎重に選択した場所でそれらを壊す必要があります。それが JMH が行っていることです。実験装置を構築するための手段を提供します。JMH サンプルは、複雑さとシナリオを非常によく説明しています。
そして、まあ、ベンチマークはコンパイラと戦うことだけではありません。非常に多くの非コンパイラ (および非 JVM!) の問題に対処する必要があります。もちろん、手動で行うこともできます (JMH は魔法のようなものではなく、人間によって作成された単なるツールです) が、予算のほとんどを簡単な問題に費やすことになり、本当に重要な問題に取り組む時間がなくなります。実験に固有のもの。
JITは防弾でも万能でもありません。たとえば、特定のコードが特定の回数実行される前に開始されたり、バイトコードが大きすぎる/深く埋め込まれている場合などに開始されません。また、多くの場合、JIT がまったく動作しないライブ インストルメンテーションを検討してください (プロファイリングを考えてください)。
したがって、それをオフまたはオンにできることに関心が残っています。コードの一部が実際にタイム クリティカルである場合、JIT が作動するかどうかに応じてコードがどのように実行されるかを知りたい場合があります。
しかし、そのような状況は非常にまれであり、JVM (したがって JIT) が進化するにつれてますますまれになっています。