Java が C++ よりも高速であるかどうかについての資料を読んでいて、次の引用に出くわしました。
JIT は仮想関数の境界を越えてインライン化できるため、Java は C++ よりも高速になる可能性があります。
これは何を意味するのでしょうか?C ++はvtableを介して関数を呼び出さなければならないのに対し、JITは仮想関数呼び出しをインライン化できるということですか(おそらく実行時情報にアクセスできるため)?
Java が C++ よりも高速であるかどうかについての資料を読んでいて、次の引用に出くわしました。
JIT は仮想関数の境界を越えてインライン化できるため、Java は C++ よりも高速になる可能性があります。
これは何を意味するのでしょうか?C ++はvtableを介して関数を呼び出さなければならないのに対し、JITは仮想関数呼び出しをインライン化できるということですか(おそらく実行時情報にアクセスできるため)?
あなたの質問に対する答えはイエスです。それが引用されたテキストの意味です。
JIT はロードされたすべてのクラスを分析します。特定の時点で呼び出すことができるメソッドが 1 つだけであると判断できる場合、ディスパッチを回避し、(適切な場合) メソッド本体をインライン化できます。
対照的に、C++ コンパイラは可能なサブタイプをすべて認識しているわけではないため、(仮想) メソッドに対してこの最適化を実行できるかどうかを判断できません。(そして、リンカーが実行されるまでには、手遅れです...)
他の回答では、C++ で手動でこの最適化を行うことができると言われていますが、それはあなた (プログラマー) が自分で分析を行い、メソッドを仮想から非仮想に変更できることを前提としています。しかし、それを間違えると、バグを追跡する必要があります。
ところで、この最適化は、平均的な Java アプリケーションにとって価値があると考えられます。そうでなければ、JIT コンパイラの担当者はそれを実装していないでしょう。結局のところ、価値のない最適化は、Java アプリケーションの起動を遅くするだけです。
Javaバイトコードのマシンコードへのコンパイルは実行時まで延期されるため、JVMは、コードが実行されるまで利用できない情報を必要とするプロファイルガイドによる最適化やその他の最適化を実行できます。これには、他の最適化を実行できるように、以前に行われた最適化が取り消される「最適化解除」も含まれる場合があります。
これに関する詳細は、ウィキペディアの適応最適化にあります。これには、インライン化に関連する最適化が含まれます。
なんといっても、Java、C++、Assembly は比較的同じパフォーマンスを提供します。
はい、手動で最適化された C++、C、または Asm を使用すると、より優れたパフォーマンスを達成できます。実装により、認識されたパフォーマンスの低下が補われます。