2016-01-27 3 views
7

各フォークは、各仮想マシンインスタンスはJIT指示のわずかな違いで実行可能性があることを理由別の仮想マシンを作成しIIUC場合は?私も時間属性は以下の注釈に何をするかについて興味JMH @Forkの目的は何ですか?

@Warmup(iterations = 10, time = 500, timeUnit = TimeUnit.MILLISECONDS) 
@Measurement(iterations = 10, time = 500, timeUnit = TimeUnit.MILLISECONDS) 

TIA、 オレ

+0

私はあなたの質問に答えます:http://stackoverflow.com/questions/25572778/why-does-jmh-run-different-forks – Tunaki

+0

したがって、IIUC、各フォークは別のVMで実行されます。実行される各VMに微妙な違いがあるため、ランタイムが異なるため、これを考慮して分散計算を行うことができます。 – Ole

+0

ええ、JITの振る舞いにおける各実行の違いによって、フォークがそれを考慮に入れることができます。ベンチマークを実行しているとき、JITが処理を異なる方法で実行しているため、あるテストではある平均値を持ち、同じテストで別のテストを実行すると非常に奇妙なケースがありました。 – Tunaki

答えて

7

JVMは、アプリケーションの動作のプロファイルを作成して、アプリケーションを最適化します。フォークは、このプロファイルをリセットするために作成されます。そうでなければ、実行中:最初のベンチマークのプロファイルは、第二に影響を与えるため

benchmarkFoo(); 
benchmarkBar(); 

benchmarkBar(); 
benchmarkFoo(); 

異なる測定値をもたらすかもしれません。

回は、ウォームアップやベンチマークを実行するためのJMH支出のな長さを決定します。これらの時間が短くなると、VMが十分にウォーミングされないか、結果が標準偏差が大きすぎる可能性があります。

12

JMHは、いくつかの理由のためにフォークの機能を提供しています。 1つは、上記のRafaelによって議論されたコンパイルプロファイルの分離です。しかし、この動作は@Forksアノテーションによって制御されません(0個のフォークを選択しない限り、サブプロセスはベンチマークを実行するためにforkされません)。ウォームアップモードコントロール(-wm)を使用すると、ベンチマークウォームアップの一部としてすべてのベンチマークを実行することができます(JITのための混合プロファイルを作成する)。

現実には、実行時の分散を確立するためにベンチマークを複数回実行することは、JMHがサポートする重要なプラクティスです(ほとんどの手作業フレームワークは、助けてください)。分散を実行するための実行の理由は、(私はそれ以上があります確信している)かもしれない:特定のC-状態で

  • CPU開始し、それを下に過熱し、スケール、その後、負荷の面において周波数をスケールアップ。特定のOSでこの問題を制御できます。あなたのプロセスの

  • メモリのアライメントは、ページング動作の違いにつながることができます。

  • バックグラウンドアプリケーションアクティビティ。
  • OSによってCPUの割り当ては、各実験のために使用されるCPUの異なるセットをもたらす変化するであろう。
  • ページキャッシュの内容とスワップ
  • JITコンパイルが同時にトリガされ、結果が異なる可能性があります(これは、テスト中のコードが大きい場合に発生する傾向があります)。小さなシングルスレッドのベンチマークでは通常この問題は発生しません。
  • GCの挙動が異なる結果につながる実行するために実行からわずかに異なるタイミングでトリガすることができます。

少なくともいくつかのフォークを使用してベンチマークを実行すると、これらの相違を払拭するのに役立ち、ベンチマークに表示された実行の実行を知ることができます。私はあなたのベンチマークに応じて、デフォルトの10から始めて、それを元に戻して(またはそれを上げて)実験的に行うことをお勧めします。

関連する問題