我一直在阅读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
在上述例子中,在第一次迭代中所测量的时间是显著低于后续运行中的测量时间。我认为这是由于无序执行。第一次迭代我做了什么错误?
我的直觉是,Java不会重新安排非内联函数调用,因为它无法在一般意义上知道它们可能具有哪些副作用(特别是如果函数位于不同的编译单元中)。但我不能支持任何事情。 – Patashu 2013-03-25 03:45:13
这可能是一个系统调用,它超出了Java内存模型的范围。 – ZhongYu 2013-03-25 04:25:52