2016-07-08 8 views
0

の@SetupメソッドからBenchmarkParamsにアクセスすることがそのクラスをパラメータとして@Benchmarkに渡された場合、@State(Scope.Benchmark)クラスの@SetupBenchmarkParamsにアクセスすることは可能ですか?JMH:@stateクラス

最小限のコード例では、(実際の使用はより複雑であるが、これは私の問題を再現する):

@State(Scope.Benchmark) 
public class Test 
{ 
    @Setup 
    public void setUp(BenchmarkParams params){} 

    @Benchmark 
    public void nothing(Test test){} 
} 

あり、基本的なJMH sampleですが、@State@Benchmark方法

に渡されていないところBenchmarkParams@Setupにアクセスして、JMH @Paramの値に基づいて作成したベンチマークごとの設定データを取得/ログに記録したいと考えています。

上記のサンプルコードでは

、:

  1. Test <という名前@State(Scope.Benchmark)クラスを定義するには、--- ---
  2. nothing() <という名前@Benchmarkメソッドを定義作品@Benchmark方法<へ
  3. パス@Stateインスタンスを動作します - - FAILS!ここで

は誤りです:

[ERROR] 
/Users/.../jmh-benchmarks/target/generated-sources/annotations/test/generated/Test_nothing_jmhTest.java:[390,16] 
method setUp in class test.Test cannot be applied to given 
types; 
    required: org.openjdk.jmh.infra.BenchmarkParams 
    found: 
org.openjdk.jmh.infra.generated.BenchmarkParams_jmhType,org.openjdk.jmh.infra.generated.BenchmarkParams_jmhType 
    reason: actual and formal argument lists differ in length 

任意のヘルプを歓迎!

[EDIT 1]

FYI、私の実際のコードに@State(Scope.Thread)クラスもあり、より多くのようなもの:

@State(Scope.Benchmark) 
public abstract class TestBase 
{ 
    @Setup 
    public void setUp(BenchmarkParams params){} 
} 

@State(Scope.Benchmark) 
public class TestImpl extends TestBase 
{ 
    @State(Scope.Thread) 
    public static class ThreadState 
    { 
      @Setup 
      public void setUp(TestImpl state){} 
    } 

    @Benchmark 
    public void nothing(ThreadState state){} 
} 

[EDIT 2]のよう

JMH 1.3これはもはや問題ではない

答えて

2

JMH失敗を構築

@SetupTestBaseの原因にBenchmarkParamsをINGの「メイン」DAG(例えばのない一部である@State(Scope.Benchmark)クラスにBenchmarkParamsを渡すDAGs of @State classes

を有することに関連しているように見えます、@State(Scope.Benchmark) - >@State(Scope.Thread)からBenchmarkParamsStateが原因TestBase@Setupに渡されることに(大きいDAGの一部であるため>@Benchmark)ブランチ)は、さらに

@State(Scope.Benchmark) 
public abstract class TestBase 
{ 
    @Setup 
    public void setUp(BenchmarkParamsState state) 
    { 
     // do something with state.someParam 
    } 

    @State(Scope.Benchmark) 
    public static class BenchmarkParamsState 
    { 
     String someParam; 

     @Setup 
     public void setUp(BenchmarkParams params) 
     { 
      // set someParam based on contents of params 
     } 
    } 
} 

@State(Scope.Benchmark) 
public class TestImpl extends TestBase 
{ 
    @State(Scope.Thread) 
    public static class ThreadState 
    { 
     @Setup 
     public void setUp(TestImpl state){} 
    } 

    @Benchmark 
    public void nothing(ThreadState state){} 
} 

、その問題例えば

を解決しているようですその@Setupはまだすべての@Benchmark

[EDIT]

のために1回発生します

JMH 1.3以降はもう問題ありません