我尝试过使用 和...一起 , ,但到目前为止我还没有设法正确设置它以便基于 .scala 的基准测试工作。

作为组合 基于 sbt + .java 的基准测试 有效,我尝试从这个基础开始。我正在使用 sbt 0.13.1。


使用 sbt 基于 .java 的基准测试

构建.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组装 需要插件:

项目/程序集.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 条警告
[信息] 包括:jmh-java-benchmark-archetype-0.5.5.jar
[信息] 包括:jmh-generator-bytecode-0.5.5.jar
[信息] 包括:jopt-simple-4.6.jar
[信息] 包括:jmh-generator-reflection-0.5.5.jar
[信息] 包括:jmh-generator-annprocess-0.5.5.jar
[信息] 包括:asm-4.2.jar
[信息] 包括:commons-math3-3.2.jar
[信息] 包括:jmh-core-0.5.5.jar
[信息] 包括:scala-library.jar
[...]
[信息] 打包 /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 

到目前为止,一切都很好。


使用 sbt 进行 Scala 基准测试

从这个基础上,我尝试切换到基于 .scala 的基准测试:

构建.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/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 任何一个。


资源:

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

有帮助吗?

解决方案

我已经实施了一个 sbt-jmh 实际工作的插件: https://github.com/ktoso/sbt-jmh

目前不支持构建 benchmarks.jar,但您可以简单地键入 run -i 10 .*MyBenchmark.* 它会按预期工作(为您完成所有多步骤编译)。

我希望这有帮助,干杯!

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top