4

ウィキペディアでこれに出くわしました:

Java は、C++ の追加の Virtual-Table ルックアップにより、C++ が派生仮想メソッドにアクセスできるよりも高速に派生インスタンス メソッドにアクセスできます。ただし、C++ の非仮想メソッドは、V-Table パフォーマンスのボトルネックに悩まされないため、Java と同様のパフォーマンスを示します。

これは正しいです?私の知る限り、すべての呼び出しは Java では仮想であり、依然として仮想テーブルに依存しているため、私の一般的な論理では、Java 呼び出しは仮想 C++ 呼び出しよりも高速になる可能性がないことが示唆されています。

私の誤解ですか、それとも記事が間違っていますか? いずれにせよ、実行時に仮想テーブルよりも高速に呼び出しを解決する方法はありますか?

4

2 に答える 2

7

JIT コンパイルによって実行される最適化に関係している可能性があります。場合によっては、JVM が特定の (仮想) 呼び出しが常に特定の実装を参照し、ルックアップが不要であることを検出すると想像できます。

C++ コンパイラである OTOH は、場合によってはルックアップが不要であると推測し、同等に優れたコードを生成することもできます。また、仮想関数は C++ では必要ないため、Java が提供しない代替手段があります。

virtualとはいえ、C++ で提供される機能が必要な場合、私が考えるより一般的に優れた代替手段はありません。パフォーマンスを気にする場合は、virtual通常はコストがかかり、必要な場合にのみ使用する必要があることに注意してください。

一般的に、あなたが引用したような発言は役に立たず、誤解を招くものだと思います (もちろん、あなたのせいではありません)。

于 2013-02-17T08:53:08.127 に答える
3

その引用のソースを読む:

コンパイラは、どのクラスが実際にロードされ、呼び出されているかを認識しているため、どのメソッドを非仮想化およびインライン化できるかを認識しています。(驚くべきことに、最新の Java コンパイラは、JIT コンパイルが発生した後にオーバーライド メソッドがロードされた場合に、インライン呼び出しを「アンコンパイル」する方法も知っています。)

C++ コンパイラがそれを実行できなかった理由はわかりませんが。

于 2013-02-17T08:52:22.763 に答える