我是JMH的新手。在运行我的代码并使用不同的注释之后,我真的不明白它是如何工作的。 我使用iteration = 1,warmup = 1,fork = 1,以便看到我的代码将被执行一次,但事实并非如此。 JMH运行我的代码超过100,000次,我不知道为什么。那么,我该如何控制代码调用的时间? 这是我的代码:(我为我的测试修复了JMHSample_01)
package org.openjdk.jmh.samples
import java.util.concurrent.TimeUnit
import org.openjdk.jmh.annotations._
@OutputTimeUnit(TimeUnit.MILLISECONDS)
@BenchmarkMode(Array(Mode.AverageTime))
@State(Scope.Thread)
@Warmup(iterations = 1, time = 1)
@Measurement(iterations = 1, time = 1)
@Fork(1)
class JMHSample_01_HelloWorld {
@Benchmark
def wellHelloThere(): Unit = {
// this method was intentionally left blank.
val a:Int = 1
val b:Int = 2
val c:Int = a + b
println("this is c " + c)
}
}
答案 0 :(得分:0)
这就是JMH的工作原理:它执行你的代码十几次,以找出平均执行时间。在Java JIT编译器优化代码之前,需要多次运行Java程序。基准测试使JIT编译器认为基准测试方法非常重要,以便对其进行适当优化。
您的基准测试存在许多问题:如果这是您要测量的内容,那么1 + 2
总是3
是确定性的:它只会将计算结果替换为最终结果。
请look at the JMH samples了解如何正确使用JMH。在这种情况下,它不会起到很大的作用,你的基准测试是用Scala编写的,因为它编译成Java字节代码。