多次读取相同索引时,JVM优化数组是否可以读取?请考虑以下事项:
public static void foo(int[] array) {
for (int i=0; i<array.length; i++) {
int value1 = array[i];
...
int value2 = array[i];
...
}
...
}
array[i]
在循环中被读取两次。假设array[i]
未在循环中重新分配,是否允许JVM假设array[i]
没有改变,因此只读取一次值?由于array
是传入的可变对象,因此可以想象在第一次和第二次读取之间发生了变化。
我查看了生成的字节代码,确实读了array[i]
两次(daload
)。 JVM是否允许将其优化为一次读取?
答案 0 :(得分:2)
是的,优化器只考虑单线程数据流,它不关心另一个线程是否更改了变量,除非涉及到volatile / synchronized。
即使没有优化,第二次读取应该非常快,大约1ns,因为数据很可能在L1缓存中。
答案 1 :(得分:0)
我认为JVM不会优化此读取,但daload
操作的开销应该是微不足道的。
如果您只想从数组中读取一次值,请尝试分配一个局部变量(花费一些简单的局部变量堆栈内存)
int origVal = array[i];
int value1 = origVal;
...
int value2 = origVal;
测试应该证明这种变化是任意的。