JMH Micro Benchmark Annotations with Scala

JMH Micro Benchmark Annotations with Scala

我是JMH的新手。在 运行 修改我的代码并使用不同的注释后,我真的不明白它是如何工作的。 我使用 iteration = 1, warmup = 1, fork =1 来查看我的代码将被执行一次,但事实并非如此。 JMH 运行 我的代码超过10万次了,我也不知道为什么。那么,我怎样才能控制我的代码调用的次数呢? 这是我的代码:(我为测试修复了 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)
  }

}

这就是 JMH 的工作原理:它会执行您的代码十几次,以找出平均执行时间。在 Java JIT 编译器优化代码之前,Java 程序需要 运行 多次。基准测试让 JIT 编译器认为基准测试方法很重要,以便正确优化它。

你的基准有很多问题:它是确定性的,其中 1 + 2 总是 3 如果这是你想要衡量的:它只会用最终结果替换计算。

look at the JMH samples学习如何正确使用JMH。在这种情况下,您的基准测试是用 Scala 编写的,因为它编译为 Java 字节代码并没有太大作用。