0

我正在做一个大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

4

1 回答 1

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()会抛出你看到的异常。

我不认为它使用了完整的项目,而仅用于Stateor中直接引用的内容Benchmark

一旦我以这种方式编写了工作台文件,它就起作用了。

于 2021-04-06T15:11:00.077 回答