JMH、つまりJavaのマイクロベンチマークハーネスは、コードのマイクロベンチマークのために設計されたツール群です。マイクロベンチマークそれは何ですか?単にメソッドレベルのベンチマークに基づいて、精度はマイクロ秒に達することができることを意味します。あなたは、ホットスポットを見つけ、あなたがJMH分析を定量化する最適化するために、結果を使用することができたとき、私は別の方法のパフォーマンスを最適化したいと考えていたとき。
JMH典型的なアプリケーションのシナリオは以下のとおりです。
- 私はこの方法を実行するために必要な正確にどのくらい知っている、と時間と入力の間の相関を実行します。
- 与えられた一定の条件の下で、異なるインターフェースの比較では、最適な実装を見つけるために
- どのくらい要求の完了の割合を見ます
1、JMH環境を構築します
<dependency>
<groupId>org.openjdk.jmh</groupId>
<artifactId>jmh-core</artifactId>
<version>1.20</version>
</dependency>
<dependency>
<groupId>org.openjdk.jmh</groupId>
<artifactId>jmh-generator-annprocess</artifactId>
<version>1.20</version>
<scope>provided</scope>
</dependency>
(高dateTimeのカレンダーと同時ケースで性能を比較例とこのケースでは)ケースを使用
2、実行
あなたは、エラーが発生する場合があります。
Exception in thread "main" java.lang.RuntimeException: ERROR: Unable to find the resource: /META-INF/BenchmarkList
ソリューション:のM2e-aptの日食のプラグインをインストールし、自動的にJDT APTオプションを設定可能。
3、基本的な概念
モード:モードが実行ベンチマークJMHが使用するモードを示しています。測定通常異なる寸法、又は異なる測定方法。
JMH 4つのモデルは現在ありません。
- スループット:全体的なスループット、例えば、「どのように何回も1秒で実行を呼び出すことができます。」
- AverageTime:平均通話時間は、「各呼び出しは、xxxはミリ秒単位の平均をとる。」など
- サンプル時間:ランダムサンプリングなどの最終出力結果の一様サンプリング、「XXX MS内のコールの99パーセント、コールの99.99%XXXミリ秒以内」
- SingleShotTime:複数の反復が唯一SingleShotTimeは、デフォルトモードは1秒である
1回だけ実行されます。多くの場合、同時に数は、テスト、パフォーマンスコールドスタートのためのゼロウォームアップです。 - 反復:反復がJMHテストの最小単位です。ほとんどのモデル、1秒に代わって最初の反復では、JMHは、
メソッドを呼び出していきますそして、彼らのサンプリングモード、演算スループット、計算の平均実行時間に応じて、第二でのベンチマークが必要です。 - ウォームアップ:ウォームアップは、実際のベンチマーク前に予熱する行為を指します。なぜ我々はウォームアップが必要なのですか?ためのJIT JVM
メカニズムの存在は、その関数が複数回呼び出された場合、JVMは、実行速度を向上させるためのマシンコードになるためにそれをコンパイルしようとします。ベンチマークするためには
、予熱の必要性について実際の状況に結果が近いです。
4、ノートとオプション
- @BenchmarkModeは:モードオプションに相当し、クラスまたはメソッドを使用することができ、
注釈の値が配列であることに留意すべきで、すなわち、すべてが再度実行、いくつかのモードがMode.Allに提供されてもよい一緒に行うことができます。 - @state:クラスのノート、JMHテストクラスは@stateのアノテーションを使用する必要があり、国家はそれが春の豆の範囲を比較することができ、クラスのインスタンスのライフサイクルを定義します。
JMHは、複数のスレッドが同時にテストを実行できるので、別のオプションは、以下の意味を有します。
- Scope.Thread:デフォルト状態は、各スレッドは、試験例を割り当てられる;
Scope.Benchmark:すべてのスレッドは、試験例を共有し、パフォーマンステストは、マルチスレッドを共有した状態で、例えばある。
Scope.Group:共有各スレッドグループ一例として、 - @OutputTimeUnit:ベンチマーク
クラスまたはメソッドに使用される時間単位の結果は、標準時間単位java.util.concurrent.TimeUnitを用いて注釈を付けることができます。 - @Benchmark:注釈付きメソッドは、メソッドオブジェクトがベンチマークであることが必要であることを示しています。
- @Setup:注釈付きメソッドは、その名前が示唆するように、主に初期化するために使用され、ベンチマークを実行する前に実行されます。
- @TearDown:注釈付きメソッド、相対は、主に資源循環のために、すべてのベンチマークの実行が終了した後@Setupを実行します。
- @param:注釈のメンバーは、特定の場合の複数のパラメータを指定するために使用することができます。様々な入力パラメータの場合、機能の性能を試験するために特に適しています。@paramがStringアノテーション配列を受け取り、それが@setupデータ型の前に行わ対応する方法に変換します。注釈@Param製品関係の複数の間の部材であり、例えば、@Param注釈を持つ2つのフィールド、最初の5つの値があり、第2フィールドは、2の値を有し、各試験方法は、* 5を実行します2 = 10回。