Ber*_*ium 11 scala microbenchmark sbt jmh
我曾尝试使用江铃控股有限公司连同SBT,但到目前为止,我还没有成功地设置正确,这样.scala基于基准的工作.
由于基于sbt + .java的组合基准测试可行,我试图从该基础开始.我正在使用sbt 0.13.1.
build.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")
Run Code Online (Sandbox Code Playgroud)
要在最后获得一个"胖"jar,需要sbt-assembly插件:
项目/ assembly.sbt
addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.11.2")
Run Code Online (Sandbox Code Playgroud)
一个简单的基准:
的src/main/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;
}
}
Run Code Online (Sandbox Code Playgroud)
Running sbt assembly给出了这个输出:
$ sbt assembly
[...]
[info]编译2个Scala源和2个Java源代码...
[warn]警告:来自注释处理器'org.openjdk.jmh.generators.GenerateMicroBenchmarkProcessor'的支持的源版本'RELEASE_6'小于 -source'1.8 '
[warn] 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
Run Code Online (Sandbox Code Playgroud)
到现在为止还挺好.
从那个基础我试图切换到基于.scala的基准测试:
build.sbt
用Scala替换Java原型
libraryDependencies += "org.openjdk.jmh" % "jmh-scala-benchmark-archetype" % "0.5.5"
Run Code Online (Sandbox Code Playgroud)
因为下载失败,它不起作用.
这有效:
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"
Run Code Online (Sandbox Code Playgroud)
另一个简单基准:
的src/main /斯卡拉/应用/基准/斯卡拉/ 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
}
}
Run Code Online (Sandbox Code Playgroud)
现在sbt assembly创建jar文件,但target/scala-2.10/microbenchmarks.jar#META-INF/MicroBenchmarks不列出Scala基准测试,这些基准测试也没有显示java -jar target/scala-2.10/microbenchmarks.jar -l.
资源:
如何为Scala集成(基于字节码的)JMH处理器?或者从另一个角度来看:为什么(基于注释的)JMH处理器会自动拾取并生成基于Java的基准测试?
Kon*_*ski 10
我已经实现了一个实际工作的sbt-jmh插件:https://github.com/ktoso/sbt-jmh
目前不支持构建benchmarks.jar,但您可以简单地键入run -i 10 .*MyBenchmark.*它,它将按预期工作(为您执行所有多步编译).
我希望这会有所帮助,欢呼!