2016-07-08 4 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 
    

    어떤 도움을 환영 :

  4. 여기

오류입니다! 현재로

@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]

:

는 [편집 1]

참고로, 내 실제 코드도 @State(Scope.Thread) 클래스, 뭔가 더 같이있다 JMH 1.3 더 이상 문제가되지 않습니다.

답변

2

문제의 설명과 같이 JMH 실패를 구축 @SetupTestBase 원인으로 BenchmarkParams을 보내고하는

그것은 "메인"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]

,536 번씩 발생할

JMH 1.3부터 ​​더 이상 문제가되지 않습니다.