2010-12-03 43 views
7

如果我正在設計排序算法的測試,我可以這樣做,以避免JVM熱身?謝謝!避免jvm熱身

double count = 0; 
double start, end; 
for(int r = 0; r < warmup; r++) { 
    // do test 
} 
for(int t = 0; t < runs; t++){ 
    start = System.nanoTime(); 
    // do test 
    end = System.nanoTime(); 
    count += start - end; 
} 
double avg = count/avg 
+2

您還在嘗試對5000個元素進行排序,還是您決定遵循上一個問題中給出的建議?如果你決定遵循這個建議,你應該接受其中的一個答案。 – Anon 2010-12-03 13:38:32

+0

非常感謝,我會那樣做 – Ang 2010-12-03 13:50:01

回答

5

JVM熱身通常指的是JVM找到熱點和JIT代碼的這些部分所需的時間。如果你運行幾百次(實際上相當於幾千次)的實際測試,那麼你應該相當不錯。

但是你應該知道,即使你這樣做,也沒有保證。您必須嘗試使用​​特定的JVM來確定在關鍵部件被打開之前需要做多少工作等等。


this little case study JIT編譯在1700次調用後踢了。

0

是的。由於暖機循環運行實際測試,這意味着所有類等都將被加載,並且JIT編譯應該已經運行。

3

如果我正在設計排序算法測試,我可以這樣做,以避免JVM熱身?

第一次有一些pedantry。您不應該避免 JVM熱身。它需要發生。你試圖做的是防止的JVM熱身扭曲你的基準測試結果。

要回答你的問題,這種方法大致是正確的,但是很難預測你需要在初始循環中做多少次測試。它很可能取決於測試代碼,JVM版本和JVM調優參數......以及其他可能的事情。

我通常所做的只是打印原始時間,過濾出「看不見」異常計時值的初始「熱身」迭代,然後手動計算平均值。這是笨重的,但它給了我一些信心,我已經解釋了熱身和其他可能的異常來源。

2

這是一個非常大的區域,但這裏有幾個技巧:

1)確保全面測試(包括迭代循環)中被重複調用的子程序。所以你的測試在「父」方法中有for()循環。將它推到一個「孩子」並反覆調用。這使得各種JIT技術能夠真正做到完全優化,而無需進行飛行代碼替換(dynamic loop transfer等)。

2)確保長時間熱身後測試運行很長時間。如果可能的話,經過同樣長時間的熱身之後,30秒對於實際測量時間是最小的。例如,SPECjbb等,每次迭代運行幾分鐘,進行多次迭代。