2012-08-29 31 views
2

我做一個標杆是這樣的:爲什麼「long var = System.nanoTime()」和「System.nanoTime()」之間的差異在使用時間上有所不同?

for (int i = 0; i < 1000 * 1000; ++i) { 
    long var = System.nanoTime(); 
} 

需要41毫秒在我的電腦與JDK6.0

後續代碼的成本只有1毫秒!

for (int i = 0; i < 1000 * 1000; ++i) { 
    System.nanoTime(); 
} 

我想可能是時間長VAR計算成本的,所以我做這樣一個測試:

for (int i = 0; i < 1000 * 1000; ++i) { 
    long var = i; 
} 

只需花費1毫秒!

那麼,爲什麼第一個代碼塊太慢? 我是中國人。對不起,我英文很差!

回答

8

這真的取決於你如何運行你的基準。你最有可能獲得< 1ms的運行,因爲JVM是不是真的運行代碼:它已確定代碼不使用,跳過它:

for (int i = 0; i < 1000 * 1000; ++i) { 
    long var = i; 
} 

相當於

//for (int i = 0; i < 1000 * 1000; ++i) { 
// long var = i; 
//} 

和JVM可能正在運行第二個版本。

您應該閱讀how to write a micro benchmark in Java或使用基準庫,如caliper

+2

+1這聽起來有多搞笑 –

+0

好的!我明白了。可能是JDK在嘗試擴展循環時做了一些事情。這有所作爲。 – user1632580

1

JIT需要時間來檢測您的代碼沒有任何用處。更復雜的代碼,時間越長(也可能無法檢測到它在所有)

在第二和第三種情況下,它可以代替用什麼代碼(我懷疑你可以把它100倍長,它贏得不再運行)


另一種可能性是您正在同一個方法中運行所有三個測試。當第一個循環迭代超過10,000次時,整個方法在後臺編譯,當第二個和第三個循環運行時,它們被刪除。

一個簡單的方法來測試這個是改變循環的順序或更好地把每個循環放在它自己的方法來阻止它。

相關問題