私はJavaに比較的慣れていないので、JavaがC ++と比較してありふれたタスクでどのように機能するかに興味がありました。そこで、2 つの C++ 文字列フォーマット メソッド (sprintf と ostringstream) を Java の StringBuilder の使用と比較しました。実行可能ファイルごとに、最初に渡す引数は測定する反復回数であるため、すべてのコードはおおよそ次のようになります。
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
1000000回の繰り返しで
$ ./spf.out 1000000
C++ took: 1658699148 ns
$ ./oss.out 1000000
C++ took: 2053606449 ns
$java StringBuilderTest 1000000
Java took: 595965442 ns
JITer がどのように機能するのか正確にはわからないため、Java コードのプロファイリングに開始/終了タイマーを使用する方法には疑問があります。これはJavaコードを測定する有効な方法ですか? JIT'er を使用してコードを実行する場合、Java にはさらに「ウォームアップ」する必要がありますか? Java コードをプロファイリングする正規の方法は何ですか。パフォーマンスを測定する前に JITer をウォームアップする方法はありますか? それとも、小さい N の場合、JITing が測定されたパフォーマンス数値の一部になることを理解していますか?