【问题标题】:JMH Micro Benchmark Annotations with ScalaJMH Micro Benchmark Annotations with Scala
【发布时间】:2016-09-09 06:44:26
【问题描述】:

我是 JMH 的新手。在运行我的代码并使用不同的注释后,我真的不明白它是如何工作的。 我使用迭代 = 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)
  }

}

【问题讨论】:

    标签: scala microbenchmark jmh


    【解决方案1】:

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

    您的基准有很多问题:它是确定性的,其中1 + 2 始终是3,如果这是您想要测量的:它将简单地用最终结果替换计算。

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

    【讨论】:

    • "十几次" --> 我能控制吗?我的意思是我希望它是准确的。
    • 你可以限制预热和基准测试的迭代次数,但你不应该依赖它。
    • 您好,您知道有关 JMH 的详细文件吗? JMH 样品他们没有解释细节。例如,使用@Param,我不知道如何在我的def 中指定Param 的元素。他们只是使用下划线来指定元素。有没有其他办法?
    • 您可以阅读我的答案中链接的示例;我不知道其他文档来源。至于指定参数,但是有一个示例链接。我发现这些示例很有帮助,因为它们可以让您快速上手。
    • 嗨,例如,我想运行一个参数范围很大的函数。如果我使用 JMH 的 @Param,我需要指定一个参数字符串数组。我尝试在外部指定一个常量并将其插入 Param。但它无法识别。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多