2010-11-17 47 views
3

我在某些代碼上做了一些性能優化,我有兩種計算方法。在性能測試時停止java優化方法調用的最佳方法

我有一個簡單的測試工具:

long start, end; 
    long oldDuration, newDuration; 
    int answer; 

    final int TEST_COUNT = 1000; 

    start = System.currentTimeMillis(); 
    for(int i = 0 ; i < TEST_COUNT; i++) 
    { 
     answer = doCaluculationNewWay() 
    } 
    end = System.currentTimeMillis(); 

    newDuration = end - start; 


    start = System.currentTimeMillis(); 
    for(int i = 0 ; i < TEST_COUNT; i++) 
    { 
     answer = doCaluculationOldWay() 
    } 
    end = System.currentTimeMillis(); 

    oldDuration = end - start; 

我怎麼能肯定的是,JVM心不是隻是二進制化的呼叫,知道正在使用的答案心不是?

我認爲讓答案變得不穩定,但我擔心由於內存同步問題它會帶來額外的性能開銷。

+1

這不是一個很好的線束。我建議在無限循環中多次運行它們,然後忽略前10次運行。這需要一段時間才能穩定下來,並且所有事情都需要熱點彙編,等等。你永遠不應該看第一組結果。只要手動終止測試,看起來已經穩定下來了。 – 2010-11-17 14:57:32

回答

2

answer添加到某個sum變量,並在測試的退出時打印該總和。

2

僅保留加入結果到您的虛擬結果變量,即

answer += doCaluculationNewWay() 

然後打印出最終結果到控制檯 - 那麼,即使是最積極優化JIT應該考慮的結果,實際使用。

如果這個增加對整個運行時間有任何影響,那麼我非常懷疑你應該首先擔心性能。

+0

正是我會建議的。在兩次測試運行並被記錄之後,您可以稍後使用答案。 – 2010-11-17 14:55:43

1

如果您正在嘗試做微基準標記,請小心。除了上面提到的人員(記錄總數並打印它)之外,請務必使用正確的工具。像Google Caliper這樣的東西對微型基準測試非常有用。