加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

如何使用JMH进行Scala基准以及sbt?

发布时间:2020-12-16 19:03:45 所属栏目:安全 来源:网络整理
导读:我已经尝试使用 jmh与 sbt,但到目前为止我还没有设法正确设置,以便基于.scala的基准测试工作. 由于基于sbt .java的基准测试工作,我试图从该基础开始. 我正在使用sbt 0.13.1. 基于.java的基准使用sbt build.sbt import AssemblyKeys._name := "scala-benchmar
我已经尝试使用 jmh与 sbt,但到目前为止我还没有设法正确设置,以便基于.scala的基准测试工作.

由于基于sbt .java的基准测试工作,我试图从该基础开始.
我正在使用sbt 0.13.1.

基于.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程序集给出了这个输出:

$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原型

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)
> 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.*,它将按预期工作(为您做所有的多步编译).

我希望这有助于欢呼!

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读