我正在开展一个大型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.6
,sbt-jmh
版本为0.2.25
。
答案 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()
将抛出您看到的异常。
我认为它没有使用完整的项目,而仅用于在 State
或 Benchmark
中直接引用的内容。
一旦我按照这种方式编写了我的工作台文件,它就可以工作了。