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]ループ内で2回読み取られます。ループ内で再割り当てされていないと仮定するarray[i]と、JVMarray[i]は変更されていないと仮定して、その値を1回だけ読み取ることができますか?arrayは渡された可変オブジェクトであるため、1回目の読み取りと2回目の読み取りの間で変更された可能性があります。

生成されたバイトコードを確認しましたが、実際には2回読み取られますarray[i]daload)。JVMはこれを1つの読み取りに最適化することを許可されていますか?

4

2 に答える 2

2

はい、オプティマイザーは単一スレッドのデータフローのみを考慮します。変数が別のスレッドによって変更されても、揮発性/同期が関係しない限り、気にしません。

最適化を行わなくても、データは L1 キャッシュにある可能性が高いため、2 回目の読み取りは約 1ns と非常に高速です。

于 2013-02-26T23:22:15.867 に答える
0

JVM がこの読み取りを最適化するとは思いませんが、daload操作のオーバーヘッドは重要ではありません。

配列から値を 1 回だけ読み取りたい場合は、ローカル変数に代入してみてください (些細なローカル変数のスタック メモリが消費されます)。

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

テストは、変更が恣意的であることを証明する必要があります。

于 2013-02-26T23:22:19.103 に答える