Как я могу использовать JMH для тестов Scala вместе с sbt?
Я пытался использовать JMH вместе с SBT, но до сих пор мне не удалось настроить его так, чтобы работали тесты на основе .scala.
Как комбинацияsbt + .java основанные тесты работает, я пытался начать с этой базы. Я использую SBT 0.13.1.
есты на основе @ .java с использованием sbtBuild.sbt
import AssemblyKeys._
name := "scala-benchmark"
version := "1.0"
scalaVersion := "2.10.3"
scalacOptions += "-deprecation"
libraryDependencies += "org.openjdk.jmh" % "jmh-core" % "0.5.5"
libraryDependencies += "org.openjdk.jmh" % "jmh-java-benchmark-archetype" % "0.5.5"
libraryDependencies += "org.openjdk.jmh" % "jmh-generator-annprocess" % "0.5.5"
libraryDependencies += "org.openjdk.jmh" % "jmh-generator-bytecode" % "0.5.5"
assemblySettings
jarName in assembly := "microbenchmarks.jar"
test in assembly := {}
mainClass in assembly := Some("org.openjdk.jmh.Main")
Чтобы получить один «толстый» кувшин в конце, SBT-сборка требуется плагин:
Проект / assembly.sbt
addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.11.2")
Простой тест:
SRC / главная / Java / приложение / тест / Java / benchmark2 / Benchmark2.java
package app.benchmark.java.benchmark2;
import org.openjdk.jmh.annotations.GenerateMicroBenchmark;
import org.openjdk.jmh.runner.Runner;
import org.openjdk.jmh.runner.RunnerException;
import org.openjdk.jmh.runner.options.Options;
import org.openjdk.jmh.runner.options.OptionsBuilder;
public class Benchmark2 {
@GenerateMicroBenchmark
public int run() {
int result = 0;
for (int i = 0; i < 10; i++) {
result += i * i;
}
return result;
}
}
Бегsbt assembly
дает такой вывод:
$ sbt сборка
[...]
[info] Компиляция 2 исходников Scala и 2 исходников Java в ...
[warn] предупреждение: поддерживаемая исходная версия 'RELEASE_6' из процессора аннотаций 'org.openjdk.jmh.generators.GenerateMicroBenchmarkProcessor' меньше чем -source '1.8'
[предупреждение] 1 предупреждение
[info] Включая: jmh-java-benchmark-archetype-0.5.5.jar
[info] Включая: jmh-generator-bytecode-0.5.5.jar
[info] В том числе: jopt-simple-4.6.jar
[info] В том числе: jmh-generator-reflection-0.5.5.jar
[info] Включая: jmh-generator-annprocess-0.5.5.jar
[info] В том числе: asm-4.2.jar
[info] Включая: commons-math3-3.2.jar
[info] Включая: jmh-core-0.5.5.jar
[info] В том числе: scala-library.jar
[...]
[info] Упаковка /home/scala-2.10/vc/rhaag/scala/scala-benchmark/target/scala-2.10/microbenchmarks.jar ...
и получившийсяmicrobenchmarks.jar
содержит все необходимое для запуска тестов:
$ java -jar target/scala-2.10/microbenchmarks.jar -wi 3 -i 3 -f 1 app.benchmark.java.benchmark2.Benchmark2.run
[...]
Benchmark Mode Samples Mean Mean error Units
a.b.j.b.Benchmark2.run thrpt 3 607555,968 70243,275 ops/ms
Все идет нормально
есты @Scala с использованием sbtС этой базы я попытался перейти на тесты на основе .scala:
Build.sbt
Замена Java-архетипа на Scala
libraryDependencies += "org.openjdk.jmh" % "jmh-scala-benchmark-archetype" % "0.5.5"
не работает, так как загрузка не удалась.
Это работает
libraryDependencies += "org.openjdk.jmh" % "jmh-scala-benchmark-archetype" % "0.5.5" from "http://repo1.maven.org/maven2/org/openjdk/jmh/jmh-scala-benchmark-archetype/0.5.5/jmh-scala-benchmark-archetype-0.5.5.jar"
Еще один простой тест:
SRC / главная / Scala / приложение / тест / Scala / benchmark2 / Benchmark2.scala
package app.benchmark.scala.benchmark2
import org.openjdk.jmh.annotations.GenerateMicroBenchmark
import org.openjdk.jmh.runner.Runner
import org.openjdk.jmh.runner.RunnerException
import org.openjdk.jmh.runner.options.Options
import org.openjdk.jmh.runner.options.OptionsBuilder
class Benchmark2 {
@GenerateMicroBenchmark
def run() = {
Seq.range(0, 10).map(i => i * i).sum
}
}
В настоящее времяsbt assembly
создает файл jar, ноtarget/scala-2.10/microbenchmarks.jar#META-INF/MicroBenchmarks
не перечисляет тесты Scala, и они не отображаютсяjava -jar target/scala-2.10/microbenchmarks.jar -l
или
Ресурсы
JMH с @ Mav (есть ссылка намураве основанный подхо Японская страница, где я получил исходную настройку sbt отJMH с GradleКак я могу интегрировать (основанный на байт-коде) процессор JMH для Scala? Или с другой точки зрения: почему процессор JMH (на основе аннотаций) выбирается автоматически и производит тесты на основе Java?