到目前为止,Kotlin度量时间与kotlinx基准(jmh)不同

到目前为止,Kotlin度量时间与kotlinx基准(jmh)不同,kotlin,jmh,Kotlin,Jmh,我正在使用以下类进行测试(您可以找到git存储库): @ExperimentalStdlibApi @国家(范围、基准) 类测试基准{ private fun benchmark():列表{ 返回构建列表{ addAll(0..100) 洗牌 sortdescing() } } 最终乐趣测量时间(){ 结果:有吗? val时间=测量时间{ 结果=基准() } println($time ns) } @基准 @基准模式(Mode.SampleTime) @输出时间单位(时间单位纳秒) final

我正在使用以下类进行测试(您可以找到git存储库):

@ExperimentalStdlibApi
@国家(范围、基准)
类测试基准{
private fun benchmark():列表{
返回构建列表{
addAll(0..100)
洗牌
sortdescing()
}
}
最终乐趣测量时间(){
结果:有吗?
val时间=测量时间{
结果=基准()
}
println($time ns)
}
@基准
@基准模式(Mode.SampleTime)
@输出时间单位(时间单位纳秒)
final fun benchmarkFunction(){
基准()
}
}
@实验TDlibAPI
主要内容(){
TestBenchmark().measureTime()
}
使用kotlins
measureTimeNanos
我在我的机器上得到了
65238400纳秒
。但是,当通过
gradlew benchmark
使用kotlinx benchmark执行基准测试时,我得到:

  Success: N = 611869
  mean =  12388,465 ±(99.9%) 39,959 ns/op

这怎么可能呢?

你不能用
measureNanoTime
来做这样的微基准测试:结果是完全不可靠的。其中一个重要原因是JVM在运行时进行的优化,以及GC等不确定性行为或电源管理、操作系统调度和分时等系统效应

JMH的整个要点是创建一个工具,试图解决所有这些问题,以产生更可靠的微观基准测试结果

有关这些问题的更深入讨论,请参阅本文

JMH的维护者之一Aleksey Shipilëv有许多关于这个主题的引人入胜的文章和讨论。见:

  • (“两个时间戳”故事)
  • (“两害相权取其轻”的故事)

另请参见:.

您不能对这样的微基准点使用
measureNanoTime
:该结果完全不可靠。其中一个重要原因是JVM在运行时进行的优化,以及GC等不确定性行为或电源管理、操作系统调度和分时等系统效应

JMH的整个要点是创建一个工具,试图解决所有这些问题,以产生更可靠的微观基准测试结果

有关这些问题的更深入讨论,请参阅本文

JMH的维护者之一Aleksey Shipilëv有许多关于这个主题的引人入胜的文章和讨论。见:

  • (“两个时间戳”故事)
  • (“两害相权取其轻”的故事)

另请参见:.

避免JVM上的基准测试陷阱:避免JVM上的基准测试陷阱: