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

what is the difference between warmup attribute in Fork and Warmup annotation in jmh?

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

我注意到 here 中的函数 benchMurmur3_128 有 2 个与预热相关的内容。

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

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

  • 在分叉级别 warmups 参数 @Fork 指定在 [=57] 之前分叉到 运行 的预热次数=]宁基准叉。创建基准测试结果时忽略预热叉。
  • @Warmup 注释可让您指定分叉内的预热特征,包括 运行 的预热迭代次数。创建基准测试结果时忽略预热迭代。

例如:

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

所以上面显示的预热设置的总体影响是:

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

这就是为什么下面的 JMH 输出(运行 使用那些针对基准方法的注释)在 [=57= 的末尾显示 Cnt 12 ]:3 次分叉 x 4 次迭代 = 12.