在我的jmh课程中,我使用
@BenchmarkMode(Mode.SampleTime)
@Measurement(iterations = 10)
@Threads(value = 10)
在班级。
在结果中,对于cnt
列,我看到132,一种方法,155另一种方法。我假设cnt
可能意味着执行次数,但这些数字与我期待的数字不相符。
不应该执行的次数是10(线程)* 10(迭代次数)= 100?
答案 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
模式不会对方法的每次执行都进行计时。如果该方法所用的时间非常短,那么就可以使用启发式方法使其退回。