2016-07-08 1 views
0

Est-il possible d'accéder BenchmarkParams dans le @Setup d'une classe @State(Scope.Benchmark), si cette classe est passé dans un @Benchmark comme paramètre?JMH: accès BenchmarkParams de méthode @Setup de classe @State

exemple de code minimal (utilisation réelle est plus complexe, mais cela reproduit mon problème):

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

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

Il y a un JMH sample de base, mais pas là où le @State est passé dans une méthode @Benchmark

Je souhaite accéder à BenchmarkParams dans @Setup pour récupérer/consigner les données de configuration par comparaison que je crée en fonction de JMH @Param valeurs

Avec l'exemple de code ci-dessus:

  1. Define @State(Scope.Benchmark) classe nommée Test < --- ouvrages
  2. Define @Benchmark méthode nommée nothing() < --- fonctionne
  3. passe @State par exemple en @Benchmark méthode < - - ÉCHOUE!

Voici l'erreur:

[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 

Toute bienvenue d'aide!

[EDIT 1]

Pour votre information, dans mon code actuel, il y a aussi une classe @State(Scope.Thread), quelque chose comme:

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

Au JMH 1.3 ce n'est plus un problème

Répondre

2

Comme expliqué en question, laissez-passer ing BenchmarkParams en @Setup de TestBase construire les causes JMH échecs

Il semble être lié à avoir DAGs of @State classes

Passage BenchmarkParams dans une classe @State(Scope.Benchmark) qui est pas partie du DAG « principal » (par exemple, @State(Scope.Benchmark) ->@State(Scope.Thread) ->@Benchmark) branche semble résoudre ce problème

Par exemple,

@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){} 
} 

En outre, parce que BenchmarkParamsState fait partie de la plus grande DAG (en raison d'être passé dans @Setup de TestBase) son @Setup se produit encore une fois pour chaque @Benchmark

[EDIT]

A partir de JMH 1.3 ce n'est plus un problème