我一直在阅读有关 Java 内存模型的内容,并且我知道编译器可以重新组织语句以优化代码。
假设我有以下代码:
long tick = System.nanoTime();
function_or_block_whose_time_i_intend_to_measure();
long tock = System.nanoTime();
编译器是否会以我打算测量的内容不在滴答和滴答之间执行的方式重新组织代码?例如,
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
在上面的示例中,第一次迭代中测量的时间明显低于后续运行中测量的时间。我认为这是由于乱序执行造成的。第一次迭代我做错了什么?