質問

。これまでにセットしていないそれは正しくそれを上げて、スジラベースのベンチマークが機能します。

組み合わせとして 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")
.

最後に単一の「FAT」JARを取得するには、 SBT-Assembly プラグインが必要です。

プロジェクト/ Assembly.sbt

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

簡易ベンチマーク:

src /メイン/ Java / App /ベンチマーク/ 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アセンブリ
[...]
[情報] 2つのScalaソースと2つのJavaソースをコンパイルする...
[WARN]警告:アノテーションプロセッサ 'org.openjdk.jmh.Generatorators.GenerateMicRobenchMarkProcessor' '1.8'

[WARN] 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.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ベンチマーク

そのベースから、.SSCALAベースのベンチマークに切り替えようとしました:

build.sbt

Java ArchetypeをScala One

に置き換える
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 /メイン/スカラ/アプリ/ベンチマーク/ 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用の(ByteCodeベース)JMHプロセッサーをどのように統合できますか? または別の観点から:(注釈ベースの)JMHプロセッサが自動的にピックアップされ、Javaベースのベンチマークを生成するのはなぜですか?

役に立ちましたか?

解決

実際に機能する sbt-jmh プラグインを実装しました。 https://github.com/ktoso/sbt-jmh

現在BENCHMARKS.JARはサポートされていませんが、単にrun -i 10 .*MyBenchmark.*と入力することができ、それは予想通りに機能します(あなたのためのすべてのマルチステップコンパイルをする)。

これが助けて、歓声を願っています!

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top