如何使用JMH进行Scala基准以及sbt?
我已经尝试使用
jmh与
sbt,但到目前为止我还没有设法正确设置,以便基于.scala的基准测试工作.
由于基于sbt .java的基准测试工作,我试图从该基础开始. 基于.java的基准使用sbt 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") 要结束单个“胖”的jar,需要sbt-assembly插件: 项目/ assembly.sbt addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.11.2") 一个简单的基准: 的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; } } 运行sbt程序集给出了这个输出:
所产生的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 到现在为止还挺好. 使用sbt的Scala基准 从那个基地我试图切换到基于.scala的基准: build.sbt 用Scala替换Java原型 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 / 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 } } 现在,sbt程序集创建了jar文件,但目标/ scala-2.10 / microbenchmarks.jar#META-INF / MicroBenchmarks没有列出Scala基准,并且这些没有被显示为java -jar target / scala-2.10 / microbenchmarks.jar – 我也是. 资源: > JMH with maven (there is a link to an ant based approach as well) 如何集成用于Scala的(基于字节码)的JMH处理器? 解决方法
我实现了一个实际工作的sbt-jmh插件:
https://github.com/ktoso/sbt-jmh
目前,建立benchmarks.jar不支持,但您可以简单地输入run -i 10.* MyBenchmark.*,它将按预期工作(为您做所有的多步编译). 我希望这有助于欢呼! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |