我一直在阅读有关
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
在上面的例子中,第一次迭代中测量的时间明显低于后续运行中的测量时间.我认为这是由于乱序执行造成的.第一次迭代我做错了什么?