【发布时间】:2011-09-29 23:35:10
【问题描述】:
我一直在研究一些 java 原始集合(trove、fastutil、hppc),我注意到类变量有时被声明为 final 局部变量的模式。例如:
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]);
}
}
}
我已经进行了一些基准测试,这样做似乎稍微快了一点,但为什么会这样呢?我试图了解如果函数的前三行被注释掉,Java 会有什么不同。
注意:这似乎类似于 this question,但这是针对 c++ 的,并没有说明为什么将它们声明为 final。
【问题讨论】:
-
您可以尝试查看生成的 java 程序集以查看差异。
-
刚刚意识到原因可能在 HotSpot 编译器中,而不是字节码本身...
-
请发布您的基准测试代码,至少有一些机会您错误地对方法进行了基准测试并且实际上只测试了解释器而不是编译器:)
标签: java optimization micro-optimization