我對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將成爲測量的性能數據的一部分?
對於小N來說,性能數字無論如何都是毫無意義的。 –
@MichaelMyers是的,當比較C++和Java性能時,似乎「小」的具體定義可能會有所不同。請注意,對於n的每個值,C++性能如何相當成比例。 –