jmh 结果中的 cnt 列是什么?

What's the cnt column in the jmh results?

在我的 jmh class 中,我正在使用

@BenchmarkMode(Mode.SampleTime)
@Measurement(iterations = 10)
@Threads(value = 10)

在 class 级别。

在结果中,对于 cnt 列,我看到一种方法有 132 个,另一种方法有 155 个。我假设 cnt 可能意味着执行次数,但这些数字与我的预期不符。

执行次数不应该是 10(线程)* 10(迭代)= 100 吗?

坦率地说,我不知道当基准模式为 Mode.SampleTimecnt 是如何计算的,但我想澄清几件事。

首先,JMH 的基准测试本质上是并发的。 @Threads 注释指定应将 10 个线程分配给 运行 您的基准(默认为 4)。如果您不指定@Threads,它将只分配一个线程用于基准测试。

其次,如果您将模式更改为 Mode.Throughput 并添加 @Fork(value = 5) 注释,您将看到 cnt 列的值为 50。因为您的基准将在 5 个分支中执行并且每个叉子将有 10 次迭代。简单地说,对于这种情况,cntforkNumber * measurementIterations

最后,当模式为 Mode.SampleTime 或使用 @Param 注释 (cnt = numOfParams * forkNumber * measurementIterations) 时,此计算会发生变化。例如,如果您 运行 具有相同注释的不同基准 (Mode.SampleTime),您将在 cnt 列上看到不同的数字。

希望对您有所帮助!

你的前提:

10 (threads) * 10 (iterations) = 100 = number of executions

不正确。

基准方法将 运行 重复进行 10 次测量迭代,每次持续一秒,来自 10 个线程。如果该方法恰好花费 1 秒,则执行次数将匹配。报告的 cnt 是收集到的执行次数 samplessample 模式不一定对方法的每次执行都计时。如果该方法所用的时间非常短,则有一种启发式方法可以使其后退。