私はJavaメモリモデルについて読んでおり、コンパイラがステートメントを再編成してコードを最適化できることを認識しています。
次のコードがあるとします。
long tick = System.nanoTime();
function_or_block_whose_time_i_intend_to_measure();
long tock = System.nanoTime();
コンパイラーは、私が測定しようとしているものが tick と tock の間で実行されないようにコードを再編成するでしょうか? 例えば、
long tick = System.nanoTime();
long tock = System.nanoTime();
function_or_block_whose_time_i_intend_to_measure();
もしそうなら、実行順序を維持する正しい方法は何ですか?
編集: nanoTime を使用した順不同の実行を示す例:
public class Foo {
public static void main(String[] args) {
while (true) {
long x = 0;
long tick = System.nanoTime();
for (int i = 0; i < 10000; i++) { // This for block takes ~15sec on my machine
for (int j = 0; j < 600000; j++) {
x = x + x * x;
}
}
long tock = System.nanoTime();
System.out.println("time=" + (tock - tick));
x = 0;
}
}
}
上記のコードの出力:
time=3185600
time=16176066510
time=16072426522
time=16297989268
time=16063363358
time=16101897865
time=16133391254
time=16170513289
time=16249963612
time=16263027561
time=16239506975
上記の例では、最初の反復で測定された時間は、その後の実行で測定された時間よりも大幅に短くなっています。これは順不同の実行によるものだと思いました。最初の反復で何が間違っていますか?