Javaでメソッドパラメータをfinalと宣言するパフォーマンス上の理由はありますか?
のように:
public void foo(int bar) { ... }
対:
public void foo(final int bar) { ... }
それbar
が読み込まれるだけで、で変更されないと仮定しfoo()
ます。
Javaでメソッドパラメータをfinalと宣言するパフォーマンス上の理由はありますか?
のように:
public void foo(int bar) { ... }
対:
public void foo(final int bar) { ... }
それbar
が読み込まれるだけで、で変更されないと仮定しfoo()
ます。
回答:
最後のキーワードは、ローカル変数とパラメーターのクラスファイルには表示されないため、実行時のパフォーマンスに影響を与えることはありません。これは、変数が変更されない(多くの場合、その使用には疑わしい理由を考慮している)ことを意図し、匿名の内部クラスを扱うことを明確にするためにのみ使用されます。
メソッドは修飾子に関係なく、実行時に最適化コンパイラによってインライン化されるため、メソッド自体のfinal修飾子にパフォーマンスの向上があるかどうかについては、多くの議論があります。この場合も、メソッドのオーバーライドを制限するためにのみ使用する必要があります。
finalパラメータの唯一の利点は、匿名のネストされたクラスで使用できることです。パラメーターが変更されない場合、コンパイラーはfinal修飾子がなくても、それを通常の操作の一部として既に検出します。パラメータが予期せず割り当てられることによってバグが発生することは非常にまれです-メソッドがこのレベルのエンジニアリングを必要とするほど大きい場合、それらを小さくします-呼び出すメソッドはパラメータを変更できません。
JITコンパイラなど、クラスのロード後に動作するコンパイラは、finalメソッドを利用できます。その結果、finalと宣言されたメソッドには、パフォーマンス上の利点があります。
http://www.javaperformancetuning.com/tips/final.shtml
ああ、別の良いリソース
コンパイラーは、intなどのプリミティブ型を持つすべてのプライベート静的final変数を削除し、C ++マクロと同じようにコードに直接インライン化できる可能性があると思います。
しかし、これが実際に行われるかどうかはわかりませんが、メモリを節約するために行うことができます。