Есть ли способ запустить один тест с помощью 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.

После того, как я написал свой рабочий файл таким образом, он заработал.

Другие вопросы по тегам