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.SampleTime
时 cnt
是如何计算的,但我想澄清几件事。
首先,JMH 的基准测试本质上是并发的。 @Threads
注释指定应将 10 个线程分配给 运行 您的基准(默认为 4)。如果您不指定@Threads
,它将只分配一个线程用于基准测试。
其次,如果您将模式更改为 Mode.Throughput
并添加 @Fork(value = 5)
注释,您将看到 cnt
列的值为 50。因为您的基准将在 5 个分支中执行并且每个叉子将有 10 次迭代。简单地说,对于这种情况,cnt
是 forkNumber * measurementIterations
。
最后,当模式为 Mode.SampleTime
或使用 @Param
注释 (cnt = numOfParams * forkNumber * measurementIterations
) 时,此计算会发生变化。例如,如果您 运行 具有相同注释的不同基准 (Mode.SampleTime
),您将在 cnt
列上看到不同的数字。
希望对您有所帮助!
你的前提:
10 (threads) * 10 (iterations) = 100 = number of executions
不正确。
基准方法将 运行 重复进行 10 次测量迭代,每次持续一秒,来自 10 个线程。如果该方法恰好花费 1 秒,则执行次数将匹配。报告的 cnt
是收集到的执行次数 samples。 sample
模式不一定对方法的每次执行都计时。如果该方法所用的时间非常短,则有一种启发式方法可以使其后退。
在我的 jmh class 中,我正在使用
@BenchmarkMode(Mode.SampleTime)
@Measurement(iterations = 10)
@Threads(value = 10)
在 class 级别。
在结果中,对于 cnt
列,我看到一种方法有 132 个,另一种方法有 155 个。我假设 cnt
可能意味着执行次数,但这些数字与我的预期不符。
执行次数不应该是 10(线程)* 10(迭代)= 100 吗?
坦率地说,我不知道当基准模式为 Mode.SampleTime
时 cnt
是如何计算的,但我想澄清几件事。
首先,JMH 的基准测试本质上是并发的。 @Threads
注释指定应将 10 个线程分配给 运行 您的基准(默认为 4)。如果您不指定@Threads
,它将只分配一个线程用于基准测试。
其次,如果您将模式更改为 Mode.Throughput
并添加 @Fork(value = 5)
注释,您将看到 cnt
列的值为 50。因为您的基准将在 5 个分支中执行并且每个叉子将有 10 次迭代。简单地说,对于这种情况,cnt
是 forkNumber * measurementIterations
。
最后,当模式为 Mode.SampleTime
或使用 @Param
注释 (cnt = numOfParams * forkNumber * measurementIterations
) 时,此计算会发生变化。例如,如果您 运行 具有相同注释的不同基准 (Mode.SampleTime
),您将在 cnt
列上看到不同的数字。
希望对您有所帮助!
你的前提:
10 (threads) * 10 (iterations) = 100 = number of executions
不正确。
基准方法将 运行 重复进行 10 次测量迭代,每次持续一秒,来自 10 个线程。如果该方法恰好花费 1 秒,则执行次数将匹配。报告的 cnt
是收集到的执行次数 samples。 sample
模式不一定对方法的每次执行都计时。如果该方法所用的时间非常短,则有一种启发式方法可以使其后退。