2016-10-17 49 views
1

我的当前设置:控制数量江铃控股

public void launchBenchmark() throws Exception { 
    Options opt = new OptionsBuilder() 
      .include(this.getClass().getName()) 
      .mode(Mode.Throughput) //Calculate number of operations in a time unit. 
      .mode(Mode.AverageTime) //Calculate an average running time per operation 
      .timeUnit(TimeUnit.MILLISECONDS) 
      .warmupIterations(1) 
      .measurementIterations(30) 
      .threads(Runtime.getRuntime().availableProcessors()) 
      .forks(1) 
      .shouldFailOnError(true) 
      .shouldDoGC(true) 
      .build(); 

    new Runner(opt).run(); 
} 

我怎么能知道/控制(如果可能)按基准进行操作的数量?

设置预热时间和测量时间是否很重要?

谢谢。

回答

3

您无法控制每次迭代的操作次数。 JMH的全部要点是正确度量那个数字

您可以使用注释配置热身:

@Warmup(iterations = 10, time = 500, timeUnit = MILLISECONDS) 

和测量方式:

@Measurement(iterations = 200, time = 200, timeUnit = MILLISECONDS) 

只为你的使用情况

+0

啊我看到设置适当的值。你对迭代时间有很好的建议吗?例如如果我知道每个操作会花费x时间。那么我应该为每次迭代设置多少时间? – Xitrum

+0

这取决于。使用默认设置,JIT使用C1在10k迭代后编译为本机,并在30k后使用C2。所以你应该设置迭代次数和迭代时间,以确保JIT已经使用C2编译器编译了所有内容,否则你的基准测试会报告不正确的统计数据。如果您将这些值设置得过高,则只会浪费时间,但不会产生其他负面影响。 –

+0

此外,迭代时间必须足够大以补偿一些抖动,但它又取决于操作需要多长时间。例如,如果一个单独的操作需要100ms,那么至少需要几秒的迭代时间,但如果需要一个纳秒 - >那么100ms就足够了 –