Есть ли способ запустить один тест с помощью 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
, Я недавно перестроил проект, и все компилируется и работает просто отлично.
Первое печатное сообщение гласит
Обработка 6718 классов из /path-to-repo/target/scala-2.11/classes с генератором "отражения"
Я нахожу странным, что плагин пытается отразить весь проект (я думаю, включая классы в стандартной библиотеке). Перед восстановлением я получал NoClassDefFoundError
, хотя проект в остальном работал хорошо.
Так как в проекте много классов, и я не могу убедиться, что каждый кусочек соответствует jmh
требования, мне было интересно, если есть способ преодолеть эту проблему и сосредоточиться и отражать только соответствующие классы, которые помечены с @Benchmark
?
мой sbt
версия 0.13.6
и sbt-jmh
версия 0.2.25
,
1 ответ
Итак, это проблема 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
.
После того, как я написал свой рабочий файл таким образом, он заработал.