2017-03-08 13 views
5

私はjmhが新しく、スレッドの背後で何が起こるかを理解することができます。JMH状態クラスと共有対非共有状態

だから、私は@Stateアノテーションを読んで立ち往生し、共有されていない状態を共有していました。

私はこの例を読んでいます:http://hg.openjdk.java.net/code-tools/jmh/file/ecd9e76155fe/jmh-samples/src/main/java/org/openjdk/jmh/samples/JMHSample_03_States.java とそれに関する質問はありません。

最初の質問は、どのような状態クラスの正確な役割ですか?パラメータを保持するには? 2つの異なる方法で鍵を暗号化するプログラムをベンチマークしたいとしましょう。 特定の状態で注釈を付けた状態クラスにキー(Stringオブジェクト)を保持する必要がありますか? Stringオブジェクトをベンチマーククラスに保つだけですか? これについての説明は素晴らしいでしょう。

上記の例では、共有されていない状態クラスのパフォーマンスが共有されたものよりも優れていたのはなぜですか? マルチスレッド状態はどのように変更されますか?

私はこのことを初めて知っていて、jmhのための「私は5歳のように説明してください」とそのオプションを見つけることができなかったので、私は本当にあいまいでした。

答えて

2

ベンチマークの一部として@Stateオブジェクトを実行する必要があると見なすことができます。作成する時間は測定時間の一部として考慮する必要があります。

私たちはあなたがそれを計算するのにかかる時間を測定したいとしましょう:

@Benchmark 
int benchmark() { 
    int foo = 1, bar = 1; 
    return foo + bar; 
} 

残念ながらあなたのために、JITコンパイラは、あなたがこれをやらせるにはあまりにもスマートですし、単に2を返すようにする方法を折るだろう。もちろんこれは測定したいものではありません。状態を使用すると、これらの値をエスケープし、JMHにJITの値を折り返させないようにすることができます。 @Setupメソッドで値を初期化します。

別の使用例として、ベンチマークが期待したことを確認できます。これは、@TearDownメソッドで状態を検証することによって可能です。

+0

ベンチマーククラスで変数を保持し、それらを@Setupで初期化するか、変数を保持して初期化する内部クラスを作成するかどうかは本当に重要です。それを行う方法は2通りあります。 – TalOhana

+0

これは簡単ですが、最初は後者の便宜です。 –

関連する問題