我一直在閱讀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