jmh结果中的cnt列是什么?

时间:2018-06-11 14:07:35

标签: jmh

在我的jmh课程中,我使用

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

在班级。

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

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

2 个答案:

答案 0 :(得分:1)

坦率地说,我不知道基准模式为cnt时如何计算Mode.SampleTime,但我想澄清一些事情。

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

其次,如果您将模式更改为Mode.Throughput并添加@Fork(value = 5)注释,您会看到cnt列的值为50.因为您的基准测试将在5个forks和每个fork中执行将有10次迭代。对于这种情况,cnt只是forkNumber * measurementIterations

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

我希望它有所帮助!

答案 1 :(得分:1)

你的前提:

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

不正确。

基准测试方法将重复运行10次测量迭代,每次测量迭代次数为10次。如果该方法只需1秒钟,那么执行次数将匹配。报告的cnt是收集的执行样本的数量。 sample模式不会对方法的每次执行都进行计时。如果该方法所用的时间非常短,那么就可以使用启发式方法使其退回。