fork中的warmup属性和jmh中的Warmup注释有什么区别?

时间:2017-12-12 15:41:14

标签: jmh

我正在使用此tutorial学习JMH基准测试。

我注意到here中函数benchMurmur3_128有两个与热身相关的东西。

所以,我对Fork注释中的warmup属性和使用iterations属性的Warmup注释之间的区别有疑问?

1 个答案:

答案 0 :(得分:3)

使用JMH基准测试,您可以按顺序运行一个或多个分支,并在每个分支中执行一次或多次基准代码迭代。有两种形式的热身与此相关:

  • 在分叉级别, @upork 预热参数指定在运行基准分析分支之前要运行的预热分叉数。创建基准测试结果时会忽略预热叉。
  • @Warmup 注释允许您在fork中指定预热特性,包括要运行的预热迭代次数。创建基准测试结果时会忽略预热迭代。

例如:

  • @Fork(value = 3,warmups = 2)表示将依次运行5个分叉。前两个将是热身运行,将被忽略,最后3个将用于基准测试。
  • @Warmup(iterations = 5,time = 55,timeUnit = TimeUnit.MILLISECONDS)表示每个fork中将有5次预热迭代。在生成基准测试结果时,将忽略这些运行的计时。
  • @Measurement(iterations = 4,time = 44,timeUnit = TimeUnit.MILLISECONDS)表示您的基准测试迭代将运行4次(在5次预热迭代之后)。

因此,上面显示的预热设置的总体影响是:

  • 只有五把叉中的最后三把才会用作基准测试结果。
  • 每个非预热分支中只有最后四次迭代将用于基准测试结果。

这就是为什么下面的JMH输出(使用针对基准方法的那些注释运行)在运行结束时显示 Cnt 12 :3 forks x 4 iterations = 12。

jmharmup