私はいくつかのJavaプリミティブコレクション(trove、fastutil、hppc)を見てきましたが、クラス変数がfinal
ローカル変数として宣言されるパターンに気付きました。たとえば:Javaのクラス変数よりも最終ローカル変数にアクセスする方が速いのですか?
public void forEach(IntIntProcedure p) {
final boolean[] used = this.used;
final int[] key = this.key;
final int[] value = this.value;
for (int i = 0; i < used.length; i++) {
if (used[i]) {
p.apply(key[i],value[i]);
}
}
}
私はいくつかのベンチマークを行ってきた、そしてそれは、これを行うとき、それは少し高速であることが表示されますが、なぜこれがそうですか?関数の最初の3行がコメントアウトされていれば、Javaが何をするのかを理解しようとしています。
注:これはthis questionと似ていますが、これはC++用であり、なぜfinal
と宣言されたのかについては言及していません。
あなたは、違いを確認するために生成されたJavaアセンブリを調べることができます。 –
ちょうど理性がHotSpotコンパイラでバイトコード自体ではないことに気づいた... –
ベンチマークコードを投稿してください。少なくともベンチマークの方法が間違っていて、コンパイラではなくインタープリタだけをテストしてください:) – Voo