2013-01-11 63 views
1

我對Java比較陌生,我很好奇Java如何在一個普通的任務上執行vs C++。所以我比較了2個C++字符串格式化方法(sprintf和ostringstream)和使用Java的StringBuilder。對於每一個可執行文件,我傳遞的第一個參數是重複測量的次數,所以所有的代碼看起來大致如下Java的JITter如何影響測量代碼速度?

int numIterations = args[0]; // or argv[1] in C++ 

// measure begin here, ie: 
int begin = System.nanoTime(); 
// loop to measure 
for (int i = 0; i < numIterations; ++i) 
{ 
     // formatting code 
} 
// measure end here, ie 
int end = System.nanoTime(); 

這行了,我怎麼看到其他人的個人資料Java代碼。我注意到,對於少量的迭代(比如說1000),Java的性能很差。對於較大的迭代次數,(說1,000,000)Java那樣比較好:

對於1000次迭代

$ ./spf.out 1000 
C++ took: 1412618 ns 
$ ./oss.out 1000 
C++ took: 1816222 ns 
$ java StringBuilderTest 1000 
Java took: 25787951 ns 

隨着百萬迭代

$ ./spf.out 1000000 
C++ took: 1658699148 ns 
$ ./oss.out 1000000 
C++ took: 2053606449 ns 
$java StringBuilderTest 1000000 
Java took: 595965442 ns 

我懷疑使用了開始/的方法結束定時器來剖析java代碼,因爲我不確定JITer是如何工作的。這是測量Java代碼的vaild方法嗎?當用JIT'er運行代碼時,Java是否有更多的「熱身」?分析Java代碼的規範方法是什麼?在測量性能之前,有沒有辦法預熱JITer?或者只是理解,對於小型N JITing將成爲測量的性能數據的一部分?

+1

對於小N來說,性能數字無論如何都是毫無意義的。 –

+0

@MichaelMyers是的,當比較C++和Java性能時,似乎「小」的具體定義可能會有所不同。請注意,對於n的每個值,C++性能如何相當成比例。 –

回答

1

這是衡量Java代碼的vaild方法?

對於顯示的代碼是。 Java比C++聰明得多,消除了無用的代碼。在Java顯着更快的10個基準測試中,有9個是這種情況。

當用JIT'er運行代碼時,Java是否有更多的「熱身」?

是的,熱身是通過階段。確保你運行測試2-10秒,它應該足夠溫暖。你可能會忽略第一個10K-20K的運行。

分析Java代碼的規範方法是什麼?在測量性能之前,有沒有辦法預熱JITer?

有很多方法。這是最簡單的一種。

long begin = 0; 
// loop to measure 
for (int i = -11000; i < numIterations; ++i) 
    if (i == 0) begin = System.nanoTime(); 

或者只是瞭解,小的N JIT編譯將會測量到的性能數據的一部分?

這取決於你想讓你的測試有多現實。如果在生產中代碼不會被稱爲10,000次,並且它不會完全預熱,那就是您應該測量的。

+0

可以代碼獲取不加熱?說一年以上它被稱爲10000次,但是很偶然,代碼是否可以不被JIT? –

+0

隨着時間的推移,計數器會衰減。如果您花一週時間撥打10000次,則可能無法編譯。編譯完成後,如果編譯中的假設無效,則可以對代碼進行優化。這通常會導致代碼重新編譯(具有不同的假設) –

0

1000次迭代預熱虛擬機;可以有點低,我使用10萬,但在開始測量前熱身。 對於基準輸出,如果添加「每次通話時間」,而不僅是總時間,則更好。

0

blog article很長一段時間來驗證我所看到的與熱點虛擬機。

總而言之,是的,HotSpot VM會在一段時間內預熱。很多像我這樣的新手都發布了很多錯誤的性能測試,因爲他們測量虛擬機熱身時間。

要從文章引述:

在預熱時不要畫從性能統計數據的結論!

  • 執行您的測試,測量吞吐量,直到穩定。您應該放棄在預熱期間得到的統計數據。
  • 確保您知道測試場景的預熱時間有多長。我們使用10-15分鐘的熱身時間,這足夠滿足我們的需求。但是你自己測試一下! JVM需要時間來檢測熱點並編譯運行代碼。
+2

10到15分鐘?我讀過的所有內容都說「長達15秒_」! –

+0

如果您有低延遲但低吞吐量測試需要10到15分鐘,例如等待網絡IO。否則,我會說2-10秒的CPU綁定測試。 –