943

Java で正しいマイクロベンチマークを作成 (および実行) するにはどうすればよいですか?

考えるべきさまざまなことを示すコードサンプルとコメントを探しています。

例: ベンチマークは時間/反復または反復/時間を測定する必要がありますか? その理由は?

関連:ストップウォッチのベンチマークは許容されますか?

4

11 に答える 11

256

この質問は回答済みとしてマークされていますが、マイクロ ベンチマークの作成に役立つ 2 つのライブラリについて言及したいと思います。

Google のキャリパー

入門チュートリアル

  1. http://codingjunkie.net/micro-benchmarking-with-caliper/
  2. http://vertexlabs.co.uk/blog/caliper

OpenJDK の JMH

入門チュートリアル

  1. JVM でのベンチマークの落とし穴の回避
  2. JMH を Java マイクロベンチマークに使用する
  3. JMHの紹介
于 2010-12-18T23:35:07.853 に答える
92

Java ベンチマークの重要事項は次のとおりです。

  • タイミングを計る前にコードを数回実行して、最初に JIT をウォームアップします。
  • 結果を数秒または(より良い)数十秒で測定できるように、十分な時間実行してください。
  • 反復間で呼び出すことはできませんがSystem.gc()、テスト間で実行することをお勧めします。これにより、各テストで動作する「クリーンな」メモリ空間が得られることが期待されます。(はい、gc()保証というよりはヒントですが、私の経験では、ガベージ コレクションが実際に行われる可能性が非常に高いです。)
  • 私は反復と時間を表示するのが好きで、時間/反復のスコアは、「最良の」アルゴリズムが 1.0 のスコアを取得し、他のアルゴリズムが相対的な方法でスコア付けされるようにスケーリングできます。これは、反復回数と時間の両方を変えながら、すべてのアルゴリズムを長時間実行できることを意味しますが、それでも同等の結果が得られます。

.NET でのベンチマーク フレームワークの設計についてブログを書いているところです。いくつかのアイデアを提供できる可能性のある以前の投稿がいくつかあります。もちろん、すべてが適切というわけではありませんが、一部は適切である可能性があります

于 2009-02-02T17:46:59.193 に答える
23

ベンチマークは時間/反復または反復/時間を測定する必要がありますか? またその理由は?

をテストしようとして いるかによって異なります。

latencyに関心がある場合はtime/iteration を使用し、throughputに関心がある場合は iterations/time を使用します。

于 2009-02-02T19:54:35.787 に答える
16

2 つのアルゴリズムを比較しようとしている場合は、順序を交互に変えて、それぞれについて少なくとも 2 つのベンチマークを実行します。すなわち:

for(i=1..n)
  alg1();
for(i=1..n)
  alg2();
for(i=1..n)
  alg2();
for(i=1..n)
  alg1();

異なるパスでの同じアルゴリズムの実行時に、いくつかの顕著な違い (5 ~ 10% の場合もある) を発見しました。

また、各ループの実行時間が少なくとも 10 秒程度になるように、 nが非常に大きいことを確認してください。反復回数が多いほど、ベンチマーク時間の有意な数値が大きくなり、データの信頼性が高くなります。

于 2009-02-02T17:57:01.200 に答える
13

Java でマイクロベンチマークを作成する場合、多くの落とし穴が考えられます。

最初に、多かれ少なかれランダムに時間がかかるあらゆる種類のイベントを計算する必要があります: ガベージ コレクション、キャッシュ効果 (ファイルに対する OS およびメモリに対する CPU)、IO など。

2 つ目: 非常に短い間隔で測定された時間の正確性は信頼できません。

3 番目: JVM は実行中にコードを最適化します。したがって、同じ JVM インスタンスでの異なる実行は、ますます高速になります。

私の推奨事項: ベンチマークを数秒実行するようにします。これは、数ミリ秒の実行時間よりも信頼性が高くなります。JVM をウォームアップします (JVM が最適化を実行できるように、測定せずにベンチマークを少なくとも 1 回実行することを意味します)。ベンチマークを複数回 (おそらく 5 回) 実行し、中央値を取得します。新しい JVM インスタンスですべてのマイクロベンチマークを実行します (すべてのベンチマークの新しい Java を呼び出します)。そうしないと、JVM の最適化効果が後で実行されるテストに影響を与える可能性があります。ウォームアップ フェーズで実行されないものは実行しないでください (これにより、クラスのロードと再コンパイルがトリガーされる可能性があります)。

于 2009-02-02T17:46:59.583 に答える
8

さまざまな実装を比較する場合は、マイクロベンチマークの結果を分析することも重要になる可能性があることにも注意してください。したがって、有意差検定を行う必要があります。

これはA、ベンチマークの実行のほとんどで、実装が実装よりも高速である可能性があるためBです。ただしA、スプレッドが大きくなる可能性もあるため、の測定されたパフォーマンス上の利点は、Aと比較した場合に重要ではありませんB

したがって、マイクロベンチマークを正しく記述して実行するだけでなく、正しく分析することも重要です。

于 2013-01-21T14:04:05.993 に答える
7

http://opt.sourceforge.net/ Java Micro Benchmark - 異なるプラットフォームでのコンピュータ システムの比較パフォーマンス特性を決定するために必要な制御タスク。最適化の決定を導き、さまざまな Java 実装を比較するために使用できます。

于 2010-12-18T23:22:11.887 に答える