2013-03-08 49 views
6

要編寫一個好的比較測試測試,您必須運行數千(百萬)次。它將平衡(在大多數情況下)其他計劃的影響力。如何執行良好的性能比較測試?

但是,如果一個JVM可以影響結果。例如:

首先解決方法是:

final StringBuilder stringBuilder = new StringBuilder(); 
    stringBuilder.append(getStrOne()); 
    stringBuilder.append(getStrTwo()); 
    final String result1 = stringBuilder.toString(); 

其次是:

final String result2 = getStrOne() + getStrTwo(); 

我不知道哪一個更好,因爲JVM可以對結果的影響。如何知道哪一個更好?

UPDATE:我並不是指完全追加comporation測試。我在問這樣的很難測試情況

+2

你的意思是JVM可以影響結果嗎? – ddmps 2013-03-08 12:56:40

+1

第二個將被編譯器轉換爲'final String result2 =「str1str2」;' – assylias 2013-03-08 12:57:17

+0

@Pescis例如緩存。 – 2013-03-08 12:58:25

回答

2

我最近執行了一些基準測試,這些測試依賴於IBM在這裏找到的優秀文章:http://www.ibm.com/developerworks/java/library/j-benchmark1/index.html

文章描述了許多可能影響結果的準確性,例如陷阱:

  • 運行時優化/重新編譯你的代碼。
  • 死代碼消除(即未使用的結果可能會導致被刪除測試代碼)
  • 垃圾收集
  • 緩存
  • ...

最後,文章鏈接到一個網站,一個框架可以是downloaded。該框架在推斷測試方法,尋找重新編譯的證據並等待執行時間結算方面做得非常好。

0

在2個字符串的情況下,性能差異可以忽略不計,但請嘗試以下操作:

String s = ""; 
for(int i = 0; i < 10000; i++) { 
    s += i; 
} 

StringBuilder b = new StringBuilder(); 
for(int i = 0; i < 10000; i++) { 
    b.append(i); 
} 

你會發現,第二個循環是方式更快。爲什麼?由於字符串連接會在每次迭代中創建一個新的String對象,這會浪費CPU週期以及內存。

我會引用你的:

要寫出你就來測試一下幾千(百萬)倍的好comparations測試試驗。它將平衡(在大多數情況下)其他計劃的影響力。

這同樣適用於單個VM內測試:多次測試代碼,使用較大的數據,較大的循環等。比較只有一小部分是沒有意義的,由於定時精度誤差和其它影響(例如垃圾收集之間運行)。