easy-scala-bench - 手軽に sbt-jmh を実行する
ワン・ライナーないしは数行の Scala スクリプトに対して簡単に JMH でマイクロ・ベンチマークを実行できるようにシェルを書いた。
前提条件
- 0.13 系の sbt がインストールされていること
- Bash (/bin/bash) が使えること
使い方
- リポジトリのクローン
$ cd your/work/dir $ git clone https://github.com/mogproject/easy-scala-bench.git $ cd easy-scala-bench
- 測定したい Scala コードを easy-scala-bench スクリプトの入力に与える
$ echo 'for (i <- 1 to 1000) for (j <- 1 to 1000) i + j' | ./easy-scala-bench
これだけ。
入力をもとに自動的に Scala コード (src/main/scala/Bench.scala) が生成され、
コマンド sbt 'run -i 3 -wi 3 -f 1 -t 1 easy_scala_bench.Bench' が実行される。 - 測定対象外の準備コードを書くこともできる
$ echo ' val xs = (1 to 1000000).toList ==== xs.length ' | ./easy-scala-bench
準備用コードと計測用コードを「====」(イコール 4個 完全一致) という行で区切れば、区切り以降のコードだけが計測対象になる。
- シェルスクプトに対してシンボリック・リンクを張っても正しく動作する
たとえば
ln -s path/to/easy-scala-bench /usr/local/bin/
のようにパスの通る場所にリンクを作ってコマンド化してしまえば、実行ファイルのパスを意識する必要がなくなる。
実行例
$ echo 'for (i <- 1 to 1000) for (j <- 1 to 1000) i + j' | ./easy-scala-bench (snip) [info] Compiling 1 Scala source to /private/tmp/easy-scala-bench/target/scala-2.11/classes... [info] Generating JMH benchmark Java source files... Processing 3 classes from /private/tmp/easy-scala-bench/target/scala-2.11/classes with "reflection" generator Writing out Java source to /private/tmp/easy-scala-bench/target/scala-2.11/generated-sources/jmh and resources to /private/tmp/easy-scala-bench/target/scala-2.11/classes [info] Compiling generated JMH benchmarks... [info] Compiling 1 Scala source and 9 Java sources to /private/tmp/easy-scala-bench/target/scala-2.11/classes... [info] Running org.openjdk.jmh.Main -i 3 -wi 3 -f 1 -t 1 easy_scala_bench.Bench [info] # JMH 1.9.1 (released 43 days ago) [info] # VM invoker: /Library/Java/JavaVirtualMachines/jdk1.7.0_75.jdk/Contents/Home/jre/bin/java [info] # VM options: [info] # Warmup: 3 iterations, 1 s each [info] # Measurement: 3 iterations, 1 s each [info] # Timeout: 10 min per iteration [info] # Threads: 1 thread, will synchronize iterations [info] # Benchmark mode: Throughput, ops/time [info] # Benchmark: easy_scala_bench.Bench.bench [info] [info] # Run progress: 0.00% complete, ETA 00:00:06 [info] # Fork: 1 of 1 [info] # Warmup Iteration 1: 120.743 ops/s [info] # Warmup Iteration 2: 214.615 ops/s [info] # Warmup Iteration 3: 222.462 ops/s [info] Iteration 1: 226.371 ops/s [info] Iteration 2: 230.060 ops/s [info] Iteration 3: 226.733 ops/s [info] [info] [info] Result "bench": [info] 227.722 ±(99.9%) 37.095 ops/s [Average] [info] (min, avg, max) = (226.371, 227.722, 230.060), stdev = 2.033 [info] CI (99.9%): [190.626, 264.817] (assumes normal distribution) [info] [info] [info] # Run complete. Total time: 00:00:06 [info] [info] Benchmark Mode Cnt Score Error Units [info] Bench.bench thrpt 3 227.722 ± 37.095 ops/s [success] Total time: 17 s, completed Jun 6, 2015 11:08:17 PM
$ echo ' val xs = (1 to 1000000).toList xs.length ' | ./easy-scala-bench (snip) [info] # Run complete. Total time: 00:00:06 [info] [info] Benchmark Mode Cnt Score Error Units [info] Bench.bench thrpt 3 24.990 ± 71.849 ops/s (snip) $ echo ' val xs = (1 to 1000000).toList ==== xs.length ' | ./easy-scala-bench (snip) [info] # Run complete. Total time: 00:00:07 [info] [info] Benchmark Mode Cnt Score Error Units [info] Bench.bench thrpt 3 212.187 ± 35.787 ops/s (snip) $ echo ' val xs = (1 to 1000000).toVector ==== xs.length ' | ./easy-scala-bench (snip) [info] # Run complete. Total time: 00:00:06 [info] [info] Benchmark Mode Cnt Score Error Units [info] Bench.bench thrpt 3 1291414027.800 ± 568908317.371 ops/s (snip)
0 件のコメント:
コメントを投稿