2012-04-22 11 views
1

私はC++コードをJavaに変換しています。私はインライン関数について何ができるのだろうかと思っていました。 VMが(必要なときに)関数をインライン化し、これについて心配しないと仮定することはできますか?この行動を観察するにはどうすればよいですか?メインの外部関数があるとし、その周りにforループを投げ、百万回の呼び出しを引き起こします。 VMのインライン化がますます進んでいくにつれて改善が見られるはずですか?ホットスポットVMインライン機能は必要に応じて機能しますか?

答えて

4

はいJavaはインラインメソッド呼び出しを行います。インライン展開はJITコンパイラによって実行されるため、バイトコードファイルを調べることで表示されません。

特定のメソッド呼び出しに対してインライン展開が実際に発生するかどうかは、メソッド本体のサイズと、呼び出しがインライン展開可能かどうかによって異なります。 (メソッド呼び出しにディスパッチが含まれる場合、JVMが不要なディスパッチを除去するように設計された大域最適化の束を持っている場合...インライン化できません)

外部主関数での例にも同じことが適用されます。メソッド本体の大きさによって異なります。他方、この方法が実行にかなりの時間を要する場合、最適化の相対的重要度は対応して減少する。


私の助言は、この段階でこのようなことを心配することではありません。コードをはっきりと簡単に書くだけで、JITコンパイラは最適化の問題に対処できます。アプリケーションが動作しているときに、そのアプリケーションをプロファイリングし、手作業で最適化する価値のある「ホットスポット」がコード内にあるかどうかを確認できます。


しかし、私は、Visual VMの右のようなものでこれを見ることができるはずですか?私は当初インライン展開がないことを意味していますが、より多くのものがインライン展開されるので、外部メソッドの平均時間はわずかに短縮されます。

メソッド本体を実行することに関連して呼び出しを行うのに費やされる時間に応じて、それが観測され、実際には発生しないことがあります。 (プロファイリングはしばしばプログラムカウンタのサンプリングに依存しますが、特定のコード領域のサンプル数が小さすぎると、報告された時間が不正確になる可能性があります...)

これはJVMにも依存します使っている。すべてのJVMが以前に最適化したコードを再最適化するわけではありません。

最後に、JITコンパイラが出力するネイティブコードをダンプするようにJVMを設定する方法があります。これは、機械命令を読む準備ができていれば、何がインライン化されているかについて決定的な答えを与えます。

+0

しかし、私はVisual VMのようなものでこれを見ることができるはずですか?私は当初インライン展開がないことを意味していますが、より多くのものがインライン展開されるので、外部メソッドの平均時間はわずかに短縮されます。 – Nikhil

関連する問題