Inlining Java
-
18-09-2019 - |
質問
C++できるメソッドを宣言し"インライン"のコンパイラがインラインです。て理解していなどはありませんがキーワードでJava.
Inliningが行われた場合、JVMを決めるだろうか?したいので影響はこの決定なんだか?
解決
他の回答のカップルが唯一の最終的な方法をインライン化することができることを示唆している - 彼らは上書きされていないとして、ホットスポットがあれば、非finalメソッドをインライン化することができるように十分にスマートであるとして、これは、真実ではありません。のまだの。クラスはメソッドをオーバーライドしているロードされると、それは、その最適化を元に戻すことができます。明らかに必要なことはありませんです方法最終平均を作る...
基本的にはJVMがその仕事をやらせる - それはどこにあるよりも、インライン化ワークアウトでたくさん良いことがありそうです。
。あなたはJVMが良い仕事をしていないことを確信している状況を持っていますか?あなたはホットスポットを使用していると仮定すると、あなたの代わりに、クライアントのサーバーバージョンを使用してみましたか?それは、の巨大なの違いを作ることができます。
他のヒント
の実際ののインライン化は、JITコンパイラによって行われます。 JIT(HotSpotの)コンパイラができ、さらに、インラインのの仮想の方法になります。 それと対話するための最良の方法はシンプルで簡潔なコードを書くことです。 ほとんどの場合、リフレクションを使用するコードは、インライン化することができません。
希望に役立ちます。
「C ++では、私はメソッド 『インライン』を宣言することができ、コンパイラがそれをインライン化します」の...か。コンパイラがインラインまたはない機能を作るために無料で、あなたが本当に結果に影響を与えることができません。これは、コンパイラへのヒントにすぎません。
Javaではそのようなものは存在しない、(最適化を行いながら、後VM)コンパイラは、「インライン」にする方法を決定することができる。
を注最終のの方法は、(それらが派生クラスで上書きすることができるように、コンパイラは、非最終的な方法をインライン化することができない)インラインさの大きな可能性を有しています。現代のVMを使用すると、同様の最適化は、実行時に行うことができます。 VMフラグタイプを(それは、型チェックを行うことができる)し、コードをインラインであろう。チェックが失敗した場合にのみ、それは本来の最適化されていないポリモーフィックメソッド呼び出しにフォールバックします。
Inliningが起こる場合の方法の質問は
- 短
- 最終
- に依存しない為、非最終方法
これらの状況のJVMできるの効果としてから通報してください。
class A {
final int foo() { return 3; }
}
このクラスは、呼び出foo()に置換することができる定"3".当Java1仮想マシンできないことが 最終 キーワードを明示的に至ることができないっているサブクラスオーバーライド"int foo()".
Inliningの方法は、以下の特典をご利用の電話サイト
- ないメソッドの呼び出し
- 不動派遣
- 限定数倍の値は、例えば."a.foo()+2"が5のないコード実行
を行います。
過去のプログラマーが挿入された 最終 キーワードにこの理由.をより良く円滑化するinlining増加の実行速い合わせ小さめの方法を一つの大きな方法です。が多く、技術の敗北は、施設全体のモジュール化と再利用のプログラミング言語.
現代のJVMのように、Java HotSpot VMできるインラインのクラスの 最終.キーワード**.
(http://java.sun.com/developer/technicalArticles/Networking/HotSpot/inlining.html)
行動をインライン化のためにこれをお読みください。 http://www.javacoffeebreak.com/articles/thinkinginjava/comparingc++ andjava.htmlする
これは、最終的な方法は、常にインライン化ではなく、することができますと言います。
はい、それはすることができます。影響を与える方法は、静的または最終として設定方法が挙げられる。
もちろん、それについての最も重要なことは、法の構造をインラインフレンドリーにする必要があるということです。ショートは役立ちますが、最も重要なのはそれだけでそのローカル変数とそのパラメータ、ないフィールドを使用する必要があり、最小限の方法は、同じクラスの他のメソッドの呼び出します。
(あなたは短絡その他の潜在的な最適化も可能性があるため)あなたが途中で、このような最適化を行うには見てはいけないしかし、あなたは実際に物事を悪化させることができます。 JVMは時々方法は、これらのヒントなしでインライン化できることを理解するであろう。
、私はそれらの間にパフォーマンスの改善がないことを見てきました。たぶん、関数呼び出しのオーバーヘッドはすでに非常に低いです。
注:私は、性能を評価するためのボックスぼかしアルゴリズムを使用