JVM可以优化来自阵列的多次读取

时间:2013-02-26 23:15:15

标签: java jvm java-memory-model

多次读取相同索引时,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是否允许将其优化为一次读取?

2 个答案:

答案 0 :(得分:2)

是的,优化器只考虑单线程数据流,它不关心另一个线程是否更改了变量,除非涉及到volatile / synchronized。

即使没有优化,第二次读取应该非常快,大约1ns,因为数据很可能在L1缓存中。

答案 1 :(得分:0)

我认为JVM不会优化此读取,但daload操作的开销应该是微不足道的。

如果您只想从数组中读取一次值,请尝试分配一个局部变量(花费一些简单的局部变量堆栈内存)

int origVal = array[i];
int value1 = origVal;
...
int value2 = origVal;

测试应该证明这种变化是任意的。