gpt4 book ai didi

scala - 如何将 JMH 与 sbt 一起用于 Scala 基准测试?

转载 作者:行者123 更新时间:2023-12-04 02:09:51 26 4
gpt4 key购买 nike

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

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

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

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 插件:

项目/组装.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 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包含运行基准测试所需的一切:
$ 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 原型(prototype)
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 没有显示这些基准。任何一个。

资源:
  • 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 的基准?

    最佳答案

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

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

    我希望这会有所帮助,干杯!

    关于scala - 如何将 JMH 与 sbt 一起用于 Scala 基准测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23016733/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com