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

「水曜日」シーズン1の中心には大きなミステリーがあります

「水曜日」シーズン1の中心には大きなミステリーがあります

Netflixの「水曜日」は、典型的な10代のドラマ以上のものであり、実際、シーズン1にはその中心に大きなミステリーがあります.

ボディーランゲージの専門家は、州訪問中にカミラ・パーカー・ボウルズが輝くことを可能にした微妙なケイト・ミドルトンの動きを指摘しています

ボディーランゲージの専門家は、州訪問中にカミラ・パーカー・ボウルズが輝くことを可能にした微妙なケイト・ミドルトンの動きを指摘しています

ケイト・ミドルトンは、州の夕食会と州の訪問中にカミラ・パーカー・ボウルズからスポットライトを奪いたくなかった、と専門家は言う.

一部のファンがハリー・スタイルズとオリビア・ワイルドの「非常に友好的な」休憩が永続的であることを望んでいる理由

一部のファンがハリー・スタイルズとオリビア・ワイルドの「非常に友好的な」休憩が永続的であることを望んでいる理由

一部のファンが、オリビア・ワイルドが彼女とハリー・スタイルズとの間の「難しい」が「非常に友好的」な分割を恒久的にすることを望んでいる理由を見つけてください.

エリザベス女王の死後、ケイト・ミドルトンはまだ「非常に困難な時期」を過ごしている、と王室の専門家が明らかにする 

エリザベス女王の死後、ケイト・ミドルトンはまだ「非常に困難な時期」を過ごしている、と王室の専門家が明らかにする 

エリザベス女王の死後、ケイト・ミドルトンが舞台裏で「非常に困難な時期」を過ごしていたと伝えられている理由を調べてください.

セントヘレナのジェイコブのはしごを登るのは、気弱な人向けではありません

セントヘレナのジェイコブのはしごを登るのは、気弱な人向けではありません

セント ヘレナ島のジェイコブズ ラダーは 699 段の真っ直ぐ上る階段で、頂上に到達すると証明書が発行されるほどの難易度です。

The Secrets of Airline Travel Quiz

The Secrets of Airline Travel Quiz

Air travel is far more than getting from point A to point B safely. How much do you know about the million little details that go into flying on airplanes?

Where in the World Are You? Take our GeoGuesser Quiz

Where in the World Are You? Take our GeoGuesser Quiz

The world is a huge place, yet some GeoGuessr players know locations in mere seconds. Are you one of GeoGuessr's gifted elite? Take our quiz to find out!

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

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

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

ジェフ・トゥイーディーはトロルに直接話しかけ、「温かい怒りの料理」を約束します

ジェフ・トゥイーディーはトロルに直接話しかけ、「温かい怒りの料理」を約束します

写真:Mark Metcalfe / Getty Imagesバンドのファンに感謝している限り、JeffTweedyはWilcoのFacebookページを政治のないフォーラムに変えようとはしていません。フロントマンは昨日、ウィルコがソーシャルメディアの存在から州と世界の問題を遠ざけることを望んでいるトロールに転向した(またはおそらく彼らはいつもそうだった)コメント投稿者に応えてオンラインの文書を投稿した。

弾丸、バダス、そして赤ちゃん:ジョンウーの見事なピストルオペラはそれをすべて持っています

弾丸、バダス、そして赤ちゃん:ジョンウーの見事なピストルオペラはそれをすべて持っています

ハードボイルドジョンウーの1992年の傑作であるハードボイルドの数分後、2人のガンランナーが、人々が鳥かごを運ぶ香港の喫茶店の1つから逃げようとします。彼らは取引をしているが、彼らを破滅させるために数人のスーパーコップが現れ、彼らはただ逃げようとしている。

ローマ経済は大国でした

ローマ経済は大国でした

写真提供者:Clive Brunskill / Gettyローマ帝国のことを非常に多く覚えています。剣闘士は常に人気があり、軍隊はすぐ近くにありますが、ローマで最も印象的なのは、残された建物の記念碑的な風景です。

ホーク+ハチェットキャンドルで森を家に持ち帰る

ホーク+ハチェットキャンドルで森を家に持ち帰る

Hawk + ​​Hatchet Hawk + ​​Hatchetキャンドルは、キャンプファイヤー、キャビン、港町の思い出をとらえるために、手で注がれ、混ぜられた小さなバッチです。ろうそくは見栄えが良く、匂いもさらに良く、圧倒されることなく部屋を満たし、意図されたシーンをうまく呼び起こします。

ケイト・ミドルトンとウィリアム王子は、彼らが子供たちと行っているスパイをテーマにした活動を共有しています

ケイト・ミドルトンとウィリアム王子は、彼らが子供たちと行っているスパイをテーマにした活動を共有しています

ケイト・ミドルトンとウィリアム王子は、子供向けのパズルの本の序文を書き、ジョージ王子、シャーロット王女、ルイ王子と一緒にテキストを読むと述べた.

事故で押しつぶされたスイカは、動物を喜ばせ水分補給するために野生生物保護団体に寄付されました

事故で押しつぶされたスイカは、動物を喜ばせ水分補給するために野生生物保護団体に寄付されました

Yak's Produce は、数十個のつぶれたメロンを野生動物のリハビリ専門家であるレスリー グリーンと彼女のルイジアナ州の救助施設で暮らす 42 匹の動物に寄付しました。

デミ・ロヴァートは、新しいミュージシャンのボーイフレンドと「幸せで健康的な関係」にあります: ソース

デミ・ロヴァートは、新しいミュージシャンのボーイフレンドと「幸せで健康的な関係」にあります: ソース

8 枚目のスタジオ アルバムのリリースに向けて準備を進めているデミ ロヴァートは、「スーパー グレート ガイ」と付き合っている、と情報筋は PEOPLE に確認しています。

Plathville の Kim と Olivia Plath が数年ぶりに言葉を交わすことへようこそ

Plathville の Kim と Olivia Plath が数年ぶりに言葉を交わすことへようこそ

イーサン プラスの誕生日のお祝いは、TLC のウェルカム トゥ プラスビルのシーズン 4 のフィナーレで、戦争中の母親のキム プラスと妻のオリビア プラスを結びつけました。

安全な公衆パニックルーム

安全な公衆パニックルーム

不気味な音に慣れて、コンクリートの周りをうろつきます。痛みや苦い口を吐き出し、「過ち」の不思議な病気を通してもう一度味わうことを切望します。

長い間行方不明だった 2 つのサンフランシスコ クリークが間もなく日の目を見る可能性がある

都市の水路を回復する理由はたくさんありますが、気候が変化するにつれて、それらはすべてより持続可能な未来につながります.

長い間行方不明だった 2 つのサンフランシスコ クリークが間もなく日の目を見る可能性がある

サンフランシスコの長い間失われた小川を復元する動きが高まっており、コミュニティを地域の生態系と結びつけ、また、都市が気候変動や季節的な洪水に適応するのに役立つ新しいタイプの「グリーン インフラストラクチャ」を作成しています。最新の取り組みは町の 2 つの非常に異なる場所で行われており、それらは明確ではあるが補完的な方法で展開されています。

サンフランシスコのベイエリアで家族写真が撮れる場所トップ 5

サンフランシスコのベイエリアで家族写真が撮れる場所トップ 5

ベイエリアには写真を撮るための美しい屋外スポットがたくさんあります。この記事のすべての写真は、ベイエリアにいるさまざまな PictureHum フォトグラファーとの PictureHum セッションからのものです。

退屈に耐えられないから生きていけない

退屈に耐えられないから生きていけない

それが現代の衝動です — より少ないもので世界を覆し、私たちのほんのわずかな瞬間を自分たちから盗もうとする. 私はかつてダイニングルームのソファで一日を過ごし、祖父母の農家に斜めに差し込む光を眺め、私には関係のない世界について話している大人のつぶやきを半分聞いたり、壁を通してくぐもったテレビを聞いたり、遊んだりしました。床と犬と私の小さな靴を暖めた太陽の黒点と。

Language