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

887
John Nilsson 2009-02-03 07:39.

Javaで正しいマイクロベンチマークをどのように記述(および実行)しますか?

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

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

関連:ストップウォッチのベンチマークは受け入れられますか?

11 answers

Java HotSpotの作成者からのマイクロベンチマークの作成に関するヒント:

ルール0: JVMとマイクロベンチマークに関する評判の良い論文を読んでください。良いものはBrianGoetz、2005年です。マイクロベンチマークにあまり期待しないでください。限られた範囲のJVMパフォーマンス特性のみを測定します。

ルール1:タイミングフェーズの前にすべての初期化とコンパイルをトリガーするのに十分な、テストカーネルを最後まで実行するウォームアップフェーズを常に含めます。(ウォームアップフェーズでは、より少ない反復で問題ありません。経験則では、数万回の内部ループ反復です。)

ルール2:常にで実行-XX:+PrintCompilation-verbose:gcあなたはコンパイラやJVMの他の部分は、あなたのタイミング位相中に予期しない仕事をしていないことを確認することができますので、など。

ルール2.1:タイミングフェーズとウォームアップフェーズの開始時と終了時にメッセージを出力するため、タイミングフェーズ中にルール2からの出力がないことを確認できます。

ルール3:-client-server、およびOSRと通常のコンパイルの違いに注意してください。この-XX:+PrintCompilationフラグは、非初期エントリポイントを示すアットマーク付きのOSRコンパイルを報告しますTrouble$1::run @ 2 (41 bytes)。次に例を示します。最高のパフォーマンスが必要な場合は、クライアントよりもサーバーを優先し、OSRよりも通常のサーバーを優先します。

ルール4:初期化の影響に注意してください。印刷はクラスをロードして初期化するため、タイミングフェーズ中に初めて印刷しないでください。特にクラスのロードをテストする場合を除いて、ウォームアップフェーズ(または最終レポートフェーズ)以外で新しいクラスをロードしないでください(その場合、テストクラスのみをロードします)。ルール2は、そのような影響に対する最初の防衛線です。

ルール5:最適化解除と再コンパイルの影響に注意してください。パスがまったく使用されないという以前の楽観的な仮定に基づいて、コンパイラがコードをジャンクして再コンパイルする可能性があるため、タイミングフェーズで初めてコードパスを使用しないでください。ルール2は、そのような影響に対する最初の防衛線です。

ルール6:適切なツールを使用してコンパイラーの心を読み、コンパイラーが生成するコードに驚かされることを期待します。何かを速くしたり遅くしたりする理由について理論を立てる前に、自分でコードを調べてください。

ルール7:測定のノイズを減らします。静かなマシンでベンチマークを実行し、外れ値を破棄して数回実行します。-Xbatchコンパイラをアプリケーションとシリアル化するために使用し、コンパイラ-XX:CICompilerCount=1がそれ自体と並行して実行されないように設定することを検討してください。GCのオーバーヘッドを減らすために最善を尽くし、Xmx(十分に大きい)等しい値Xmsを設定し、使用UseEpsilonGC可能な場合はそれを使用します。

ルール8:ライブラリはおそらくより効率的であり、この唯一の目的のためにすでにデバッグされているため、ベンチマークにライブラリを使用します。などJMH、キャリパーやビルやJava用ポールの優れたUCSDベンチマーク。

244
Aravind Yarram 2010-12-19 13:35.

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

Googleのキャリパー

入門チュートリアル

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

OpenJDKのJMH

入門チュートリアル

  1. JVMでのベンチマークの落とし穴の回避
  2. JavaマイクロベンチマークにJMHを使用する
  3. JMHの紹介
88
Jon Skeet 2009-02-03 07:46.

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

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

.NETのベンチマークフレームワークの設計についてブログを書いているところです。私が持っているカップルの以前の記事あなたにいくつかのアイデアを与えることができるかもしれ-ませんすべてはもちろん、適切であろうが、それの一部であってもよいです。

48
assylias 2013-04-04 02:32.

jmhはOpenJDKに最近追加されたもので、Oracleの一部のパフォーマンスエンジニアによって作成されました。確かに一見の価値があります。

jmhは、JVMを対象とするJavaおよびその他の言語で記述されたnano / micro / macroベンチマークを構築、実行、および分析するためのJavaハーネスです。

サンプルテストのコメントに埋め込まれている非常に興味深い情報。

参照:

  • JVMでのベンチマークの落とし穴の回避
  • jmhの主な強みについての議論。
23
Peter Lawrey 2009-02-03 09:54.

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

それはあなたがをテストしようとしているかによります。

レイテンシーに関心がある場合は時間/反復を使用し、スループットに関心がある場合は反復/時間を使用します。

16
Kip 2009-02-03 07:57.

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が非常に大きいことを確認してください。反復回数が多いほど、ベンチマーク時間の有効数字が大きくなり、データの信頼性が高まります。

15
Peter Štibraný 2009-02-03 08:00.

ベンチマークコードで計算された結果を何らかの方法で使用するようにしてください。それ以外の場合は、コードを最適化できます。

13
Mnementh 2009-02-03 07:46.

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

まず、ガベージコレクション、キャッシュ効果(ファイルの場合はOS、メモリの場合はCPU)、IOなど、多かれ少なかれランダムに時間がかかるあらゆる種類のイベントを使用して計算する必要があります。

第二に:非常に短い間隔で測定された時間の精度を信頼することはできません。

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

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

8
SpaceTrucker 2013-01-22 04:04.

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

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

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

8
Sina Madani 2017-03-20 09:21.

他の優れたアドバイスに加えて、私は次の点にも注意します。

一部のCPU(TurboBoostを搭載したIntel Core i5シリーズなど)では、温度(および現在使用されているコアの数、および使用率)がクロック速度に影響します。CPUは動的にクロックされるため、これは結果に影響を与える可能性があります。たとえば、シングルスレッドアプリケーションの場合、(TurboBoostを使用した)最大クロック速度は、すべてのコアを使用するアプリケーションよりも高速です。したがって、これは、一部のシステムでのシングルスレッドとマルチスレッドのパフォーマンスの比較を妨げる可能性があります。温度と揮発性もターボ周波数が維持される期間に影響することに注意してください。

おそらく、直接制御できるより根本的に重要な側面です。正しいものを測定していることを確認してください。たとえばSystem.nanoTime()、特定のコードのベンチマークに使用している場合は、関心のないものを測定しないように、意味のある場所に割り当ての呼び出しを配置し​​ます。たとえば、次のことは行わないでください。

long startTime = System.nanoTime();
//code here...
System.out.println("Code took "+(System.nanoTime()-startTime)+"nano seconds");

問題は、コードが終了したときにすぐに終了時刻が取得されないことです。代わりに、次を試してください。

final long endTime, startTime = System.nanoTime();
//code here...
endTime = System.nanoTime();
System.out.println("Code took "+(endTime-startTime)+"nano seconds");
7
Yuriy 2010-12-19 13:22.

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

Related questions

MORE COOL STUFF

ケイト・ブランシェットは3日間一緒に夫と一緒に寝て、25年経ってもまだ夫と結婚しています

ケイト・ブランシェットは3日間一緒に夫と一緒に寝て、25年経ってもまだ夫と結婚しています

ケイト・ブランシェットは、夫に会ったとき、典型的な交際のアドバイスに逆らいました。

マイケルシーンが非営利の俳優である理由

マイケルシーンが非営利の俳優である理由

マイケルシーンは非営利の俳優ですが、それは正確にはどういう意味ですか?

ホールマークスターのコリンエッグレスフィールドがRomaDramaLiveでスリル満点のファンと出会う![エクスクルーシブ]

ホールマークスターのコリンエッグレスフィールドがRomaDramaLiveでスリル満点のファンと出会う![エクスクルーシブ]

特徴的なスターのコリン・エッグレスフィールドは、RomaDrama Liveでのスリル満点のファンとの出会いについて料理しました!加えて、大会での彼のINSPIREプログラム。

「たどりつけば」をオンラインでストリーミングできない理由

「たどりつけば」をオンラインでストリーミングできない理由

ノーザンエクスポージャーが90年代の最も人気のある番組の1つになった理由を確認するには、Blu-rayまたはDVDプレーヤーをほこりで払う必要があります。

バイオニック読書はあなたをより速く読むことができますか?

バイオニック読書はあなたをより速く読むことができますか?

BionicReadingアプリの人気が爆発的に高まっています。しかし、それは本当にあなたを速読術にすることができますか?

ドミニカのボイリング湖:アクセスは簡単ではありませんが、ハイキングする価値があります

ドミニカのボイリング湖:アクセスは簡単ではありませんが、ハイキングする価値があります

ドミニカのボイリング湖は、世界で2番目に大きいボイリング湖です。そこにたどり着くまでのトレッキングは大変で長いですが、努力する価値は十分にあります。

私たちの水をきれいに保つのを助けるためにあなたの髪を寄付してください

私たちの水をきれいに保つのを助けるためにあなたの髪を寄付してください

サロンからのヘアトリミングや個人的な寄付は、油流出を吸収して環境を保護するのに役立つマットとして再利用できます。

ホワイトハウスの最も記憶に残る結婚式を見てください

ホワイトハウスの最も記憶に残る結婚式を見てください

過去200年以上の間にホワイトハウスで結婚したのはほんの数人です。彼らは誰でしたか、そしてそこで結婚式を獲得するために何が必要ですか?

ジェイ・ブルースはどうやら子供を妊娠することによってメッツから離れて取引されていることを祝った

ジェイ・ブルースはどうやら子供を妊娠することによってメッツから離れて取引されていることを祝った

あなたが一時的に会っていなかったとき。シーズン11-1を開始したチームであるニューヨークメッツは、日曜日の午後にフィラデルフィアで行われた最後の11試合の9試合目を失いました。

スティーブンキングのアウトサイダーはトランプ時代のそれです

スティーブンキングのアウトサイダーはトランプ時代のそれです

スティーブン・キングのアウトサイダーは、多くの点で先祖返りの小説であり、80年代の全盛期から引き裂かれたように見える生き物の特徴であり、おそらくセル以来の彼の最もパルプのような本ですが、今日の恐怖の中で間違いなく設立された作品です。表面上は、形を変えるペニーワイズのような子供たちの殺人者を中心としており、その最も暗い脅威は、封じ込められず、神経質に平凡なものよりも幻想的で打ち負かされません。

スティーブンユニバースは、強烈な内部エピソードのペアで、それ自体のバックストーリーをさりげなく粉砕します

スティーブンユニバースは、強烈な内部エピソードのペアで、それ自体のバックストーリーをさりげなく粉砕します

スティーブンユニバースビーチシティのエピソードが実行されるたびに、いくつかのクライマックスイベントが発生し、スティーブンユニバースのより広い神話に対する理解の一部が失われます。これはあなたが期待していたことですか?今日のエピソードは両方とも、容赦なくゆっくりと、シーズンの終盤の主要な部分を設定する決定的な結論に向かって進みます。そして、ロナウドは、静かな納屋が倒れているのを発見した夜中にスティーブンを捕まえるためにやって来ます。月に。

ディズニーワールドの旅行のヒントを教えてください

ディズニーワールドの旅行のヒントを教えてください

「光が触れるものはすべて私たちの王国です。」今週のHackYour Cityでは、1つのテーマパークを取り上げます。

Zendaya Wishes Boyfriend Tom Holland Happy Birthday with Cuddly Photo: He 'Makes Me the Happiest'

Zendaya Wishes Boyfriend Tom Holland Happy Birthday with Cuddly Photo: He 'Makes Me the Happiest'

Zendaya shared a sweet photo in honor of boyfriend Tom Holland's 26th birthday Wednesday

小さな女性:脳卒中を患った後に病院から解放されたアトランタのジューシーな赤ちゃん:「まだ癒し」

小さな女性:脳卒中を患った後に病院から解放されたアトランタのジューシーな赤ちゃん:「まだ癒し」

シーレン「Ms.JuicyBaby」ピアソンは、先月脳卒中で入院した後、「もう一度たくさんのことをする方法を学ばなければならない」ため、言語療法を受けていることを明らかにしました。

エマストーンは彼女のクリフサイドマリブビーチハウスを420万ドルでリストアップしています—中を見てください!

エマストーンは彼女のクリフサイドマリブビーチハウスを420万ドルでリストアップしています—中を見てください!

オスカー受賞者の世紀半ばの家には、3つのベッドルーム、2つのバス、オーシャンフロントの景色があります。

ジーニー・メイ・ジェンキンスは、母乳育児の経験の中で、彼女は「本当に、本当に落ち込んでいる」と言います

ジーニー・メイ・ジェンキンスは、母乳育児の経験の中で、彼女は「本当に、本当に落ち込んでいる」と言います

ジーニー・メイ・ジェンキンスは、生後4か月の娘、モナコに母乳育児をしていると語った。

Come diventare Web Developer?

Come diventare Web Developer?

Vorresti diventare web developer e non sai da dove cominciare?! Qui troverai tutte le risposte necessarie, anche io non sapevo che strada intraprendere ma voglio aiutarti a non commettere i miei stessi errori. Cosa imparare? Le competenza essenziali per qualsiasi web developer sono almeno tre.

投資ノート:Bioscout AU$300万シード

投資ノート:Bioscout AU$300万シード

Bioscoutは、農家を運転席に置くという使命を負っています。Artesian(GrainInnovate)やUniseedと並んで、最新のシードラウンドでチームを支援できることをうれしく思います。問題真菌症による重大な作物の損失は、農民にとって試練であることが証明されています。

リトルマーケットリサーチ1| 2022年のクイックグリンプス遠隔医療市場

リトルマーケットリサーチ1| 2022年のクイックグリンプス遠隔医療市場

遠隔医療は、パンデミック後の時代では新しいものではなく、時代遅れの分野でもありません。しかし、業界を詳しく見ると、需要と供給の強力な持続可能性と、米国で絶え間ない革命となる強力な潜在的成長曲線を示しています。

スタートアップ資金調達環境:タイのスタートアップエコシステムの次は何ですか?

スタートアップ資金調達環境:タイのスタートアップエコシステムの次は何ですか?

2021年は、世界的なベンチャーキャピタル(VC)の資金調達にとって記録的な年でした。DealStreetAsiaによると、東南アジアも例外ではなく、この地域では年間で記録的な25の新しいユニコーンが採掘されました。

Language