2016-07-08 2 views
0

Можно ли получить доступ к BenchmarkParams в @Setup в виде @State(Scope.Benchmark) класса, если этот класс передается в @Benchmark в качестве параметра?JMH: доступ к BenchmarkParams от метода @Setup из @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. Определение @State(Scope.Benchmark) класс с именем Test < --- работает
  2. Определить @Benchmark метод, названный nothing() < --- работает
  3. Pass @State экземпляр в @Benchmark метод < - - 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

Как объяснено в вопросе, пройдите ING BenchmarkParams в @Setup из TestBase причин JMH строить неудачи

Это, кажется, связано с имеющих DAGs of @State classes

Передача BenchmarkParams в @State(Scope.Benchmark) класс, который не частью «основной» группы DAG (например,, @State(Scope.Benchmark) ->@State(Scope.Thread) ->@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){} 
} 

Кроме того, поскольку BenchmarkParamsState является частью большей доступности баз данных (за счет передается в @Setup из TestBase) его @Setup все еще происходит один раз для каждого @Benchmark

[EDIT]

От JMH 1.3 это больше не проблема

Смежные вопросы