1

私は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 が測定されたパフォーマンス数値の一部になることを理解していますか?

4

3 に答える 3

1

これはJavaコードを測定する有効な方法ですか?

はいと表示されたコードの場合。Java は、何もしないコードを排除する点で C++ よりもはるかに優れています。10 のベンチマークのうち 9 つで Java の方が大幅に高速ですが、これが当てはまります。

JIT'er を使用してコードを実行する場合、Java にはさらに「ウォームアップ」する必要がありますか?

はい、ウォームアップには段階があります。必ず 2 ~ 10 秒間テストを実行してください。十分に暖かくなっているはずです。最初の 10,000 ~ 20,000 回の実行は無視できます。

Java コードをプロファイリングする正規の方法は何ですか。パフォーマンスを測定する前に JITer をウォームアップする方法はありますか?

多くの方法があります。これは最も単純なものの 1 つです。

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

それとも、小さい N の場合、JITing が測定されたパフォーマンス数値の一部になることを理解していますか?

それは、テストをどの程度現実的にしたいかによって異なります。本番環境でコードが 10,000 回呼び出されず、完全にウォームアップしない場合は、それを測定する必要があります。

于 2013-01-11T16:59:55.817 に答える
0

このブログ記事は、ホットスポット VM で私が見ていることを検証するのに大いに役立ちます。

要約すると、はい、HotSpot VM はしばらくするとウォームアップします。私のような初心者の多くは、VM のウォームアップ時間を測定しているため、多くの誤ったパフォーマンス テストを投稿しています。

記事から引用するには:

ウォームアップ時間中は、パフォーマンス統計から結論を導き出さないでください。

  • テストを実行し、安定するまでスループットを測定します。ウォームアップ時間中に取得した統計は破棄する必要があります。
  • テスト シナリオのウォームアップ時間の長さを確認してください。10 ~ 15 分のウォームアップ時間を使用しますが、これは私たちのニーズには十分です。しかし、これを自分でテストしてください!JVM がホット スポットを検出し、実行中のコードをコンパイルするには時間がかかります。
于 2013-01-11T16:52:09.170 に答える
0

VM をウォームアップするための 1000 回の反復。少し低いかもしれません。私は 100 000 を使用しますが、測定を開始する前にウォームアップします。ベンチマークの出力については、合計時間だけでなく、「呼び出しごとの時間」を追加すると読みやすくなります。

于 2013-01-11T16:39:16.493 に答える