Java で正しいマイクロベンチマークを作成 (および実行) するにはどうすればよいですか?
考えるべきさまざまなことを示すコードサンプルとコメントを探しています。
例: ベンチマークは時間/反復または反復/時間を測定する必要がありますか? その理由は?
Java で正しいマイクロベンチマークを作成 (および実行) するにはどうすればよいですか?
考えるべきさまざまなことを示すコードサンプルとコメントを探しています。
例: ベンチマークは時間/反復または反復/時間を測定する必要がありますか? その理由は?
この質問は回答済みとしてマークされていますが、マイクロ ベンチマークの作成に役立つ 2 つのライブラリについて言及したいと思います。
入門チュートリアル
入門チュートリアル
Java ベンチマークの重要事項は次のとおりです。
System.gc()
、テスト間で実行することをお勧めします。これにより、各テストで動作する「クリーンな」メモリ空間が得られることが期待されます。(はい、gc()
保証というよりはヒントですが、私の経験では、ガベージ コレクションが実際に行われる可能性が非常に高いです。).NET でのベンチマーク フレームワークの設計についてブログを書いているところです。いくつかのアイデアを提供できる可能性のある以前の投稿がいくつかあります。もちろん、すべてが適切というわけではありませんが、一部は適切である可能性があります。
ベンチマークは時間/反復または反復/時間を測定する必要がありますか? またその理由は?
何をテストしようとして いるかによって異なります。
latencyに関心がある場合はtime/iteration を使用し、throughputに関心がある場合は iterations/time を使用します。
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が非常に大きいことを確認してください。反復回数が多いほど、ベンチマーク時間の有意な数値が大きくなり、データの信頼性が高くなります。
Java でマイクロベンチマークを作成する場合、多くの落とし穴が考えられます。
最初に、多かれ少なかれランダムに時間がかかるあらゆる種類のイベントを計算する必要があります: ガベージ コレクション、キャッシュ効果 (ファイルに対する OS およびメモリに対する CPU)、IO など。
2 つ目: 非常に短い間隔で測定された時間の正確性は信頼できません。
3 番目: JVM は実行中にコードを最適化します。したがって、同じ JVM インスタンスでの異なる実行は、ますます高速になります。
私の推奨事項: ベンチマークを数秒実行するようにします。これは、数ミリ秒の実行時間よりも信頼性が高くなります。JVM をウォームアップします (JVM が最適化を実行できるように、測定せずにベンチマークを少なくとも 1 回実行することを意味します)。ベンチマークを複数回 (おそらく 5 回) 実行し、中央値を取得します。新しい JVM インスタンスですべてのマイクロベンチマークを実行します (すべてのベンチマークの新しい Java を呼び出します)。そうしないと、JVM の最適化効果が後で実行されるテストに影響を与える可能性があります。ウォームアップ フェーズで実行されないものは実行しないでください (これにより、クラスのロードと再コンパイルがトリガーされる可能性があります)。
さまざまな実装を比較する場合は、マイクロベンチマークの結果を分析することも重要になる可能性があることにも注意してください。したがって、有意差検定を行う必要があります。
これはA
、ベンチマークの実行のほとんどで、実装が実装よりも高速である可能性があるためB
です。ただしA
、スプレッドが大きくなる可能性もあるため、の測定されたパフォーマンス上の利点は、A
と比較した場合に重要ではありませんB
。
したがって、マイクロベンチマークを正しく記述して実行するだけでなく、正しく分析することも重要です。
http://opt.sourceforge.net/ Java Micro Benchmark - 異なるプラットフォームでのコンピュータ システムの比較パフォーマンス特性を決定するために必要な制御タスク。最適化の決定を導き、さまざまな Java 実装を比較するために使用できます。