2

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

4

2 回答 2

2

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

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

于 2013-02-26T23:22:15.867 回答
0

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

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

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

测试应证明更改是任意的。

于 2013-02-26T23:22:19.103 回答