如何将JMH与sbt一起用于Scala基准测试? [英] How can I use JMH for Scala benchmarks together with sbt?

查看:115
本文介绍了如何将JMH与sbt一起用于Scala基准测试?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我尝试将的问题与的问题,但到目前为止我还没有设置正确地进行设置,以使基于.scala的基准能够正常工作.

I have tried to use jmh together with sbt, but so far I have not managed to set it up properly so that .scala based benchmarks work.

随着基于 sbt + .java的基准测试的结合,我尝试从该基础开始. 我正在使用sbt 0.13.1.

As the combination sbt + .java based benchmarks works, I tried to start from that base. I am using 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")

要在最后获得单个胖"罐子,需要 sbt-assembly 插件:

To get a single "fat" jar at the end, the sbt-assembly plugin is required:

project/assembly.sbt

addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.11.2")

一个简单的基准:

src/main/java/app/benchmark/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源代码编译到...
[警告]警告:注释处理器'org.openjdk.jmh.generators.GenerateMicroBenchmarkProcessor'支持的源版本'RELEASE_6'小于-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 ...

$ sbt assembly
[...]
[info] Compiling 2 Scala sources and 2 Java sources to ...
[warn] warning: Supported source version 'RELEASE_6' from annotation processor 'org.openjdk.jmh.generators.GenerateMicroBenchmarkProcessor' less than -source '1.8'
[warn] 1 warning
[info] Including: jmh-java-benchmark-archetype-0.5.5.jar
[info] Including: jmh-generator-bytecode-0.5.5.jar
[info] Including: jopt-simple-4.6.jar
[info] Including: jmh-generator-reflection-0.5.5.jar
[info] Including: jmh-generator-annprocess-0.5.5.jar
[info] Including: asm-4.2.jar
[info] Including: commons-math3-3.2.jar
[info] Including: jmh-core-0.5.5.jar
[info] Including: scala-library.jar
[...]
[info] Packaging /home/scala-2.10/vc/rhaag/scala/scala-benchmark/target/scala-2.10/microbenchmarks.jar ...

和生成的microbenchmarks.jar包含运行基准测试所需的所有内容:

and the resulting microbenchmarks.jar contains everything required to run the benchmarks:

$ 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 

到目前为止一切都很好.

So far so good.

从此基础上,我试图切换到基于.scala的基准测试

From that base I tried to switch to .scala based benchmarks:

build.sbt

用Scala一个代替Java原型

Replacing the Java archetype with the Scala one

libraryDependencies += "org.openjdk.jmh" % "jmh-scala-benchmark-archetype" % "0.5.5"

不起作用,因为下载失败.

does not work, as the download fails.

这有效:

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/scala/app/benchmark/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也未显示这些基准.

Now sbt assembly creates the jar file, but target/scala-2.10/microbenchmarks.jar#META-INF/MicroBenchmarks does not list the Scala benchmarks, and these are not shown by java -jar target/scala-2.10/microbenchmarks.jar -l either.

资源:

  • JMH with maven (there is a link to an ant based approach as well)
  • A Japanese page where I got the inital sbt setup from
  • JMH with gradle

如何为Scala集成(基于字节码的)JMH处理器? 或者从另一个角度来看:为什么(基于注释的)JMH处理器会自动运行并生成基于Java的基准测试?

How can I integrate the (bytecode based) JMH processor for Scala? Or from another perspective: Why is the (annotation based) JMH processor picked up automatically and produces Java based benchmarks?

推荐答案

我已经实现了一个实际上有效的 sbt-jmh 插件:

I have implemented an sbt-jmh plugin that actually works: https://github.com/ktoso/sbt-jmh

当前不支持构建Benchmarks.jar,但是您只需键入run -i 10 .*MyBenchmark.*,它将按预期运行(为您完成所有多步骤编译).

Currently building benchmarks.jar is not supported, but you can simply type run -i 10 .*MyBenchmark.* and it will work as expected (doing all the multi-step compilation for you).

我希望这会有所帮助,加油!

I hope this helps, cheers!

这篇关于如何将JMH与sbt一起用于Scala基准测试?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆