有没有办法用sbt-jmh运行单一基准测试?

时间:2017-05-22 11:50:45

标签: scala sbt benchmarking jmh sbt-jmh

我正在开展一个大型sbt项目,并且我想要一些功能进行基准测试。我决定使用jmh,因此我启用了sbt-jmh插件。

我写了一个初始测试基准,看起来像这样:

import org.openjdk.jmh.annotations.Benchmark

class TestBenchmark {

  @Benchmark
  def functionToBenchMark = {
    5 + 5
  }
}

但是,当我尝试使用jmh:run -i 20 -wi 10 -f1 -t1 .*TestBenchmark.*运行时,我得到java.lang.InternalError: Malformed class name。我刚刚重建了这个项目,所有东西都编译好了,运行得很好。

第一条打印的消息说

  

从/path-to-repo/target/scala-2.11/classes处理6718个类   用"反思"发电机

我觉得这个插件试图反映整个项目很奇怪(我想在标准库中包含类)。在重建之前我得​​到了NoClassDefFoundError,尽管该项目运作良好。

由于项目中有很多类,我不能确保每一点都符合jmh的要求,我想知道是否有办法克服这个问题,只关注并反映用@Benchmark注释的相关类?

我的sbt版本为0.13.6sbt-jmh版本为0.2.25

1 个答案:

答案 0 :(得分:0)

所以这是 Scala 和 Class.getSimpleClassName 的问题。

在 Scala 中有这样的类型并不少见:

object Outer {
   sealed trait Inner
   object Inner {
      case object Inner1 extends 
      case object Inner2 extends Inner
   }
}

使用上述调用 Outer.Inner.Inner1.getClass().getSimpleName() 将抛出您看到的异常。

我认为它没有使用完整的项目,而仅用于在 StateBenchmark 中直接引用的内容。

一旦我按照这种方式编写了我的工作台文件,它就可以工作了。