Java8の InvokeDynamic の検証で作られたというNashornがRhinoより早くなったとのことで、早速比べてみる。
それぞれの実装
Rhino
Java7までは、Rhinoを使ったコマンド行スクリプトシェルが、binの下に、jrunscriptという名前である。
詳しくはこちら。
jrunscript - コマンド行スクリプトシェル
Nashorn
Java8からNashorn実装のコマンド行スクリプトシェルがjrunscriptに変わってjjsとして置き換わった。
詳しくはこちら。
ベンチーマーク
ベンチマークするために、Google V8のベンチマークを実行してみる。
git clone git://github.com/v8/v8.git
cd benchmarks
cloneしてきた直下にbenchmarksというディレクトリがありその下にベンチマーク用のスクリプトがある。
そのなかの、run.jsを食わせる。
これです。
https://github.com/v8/v8/blob/master/benchmarks/run.js
計測
run.jsでのベンチマークはいくつかあり、それぞれ、
Richards、DeltaBlue、Crypto、RayTrace、EarleyBoyer、RegExp、Splay、NavierStokes
Octaneと同じもののよう。
詳細はこちら。
自分の環境では以下の結果に
$ /Library/Java/JavaVirtualMachines/jdk1.8.0_05.jdk/Contents/Home/bin/jjs run.js
Richards: 1104
DeltaBlue: 112
Crypto: 476
RayTrace: 435
EarleyBoyer: 664
RegExp: 245
Splay: 1043
NavierStokes: 883
----
Score (version 7): 499
$/Library/Java/JavaVirtualMachines/jdk1.7.0_25.jdk/Contents/Home/bin/jrunscript -DXmx=2024m -f run.js
Richards: 16.5DeltaBlue: 16.8Crypto: 13.4RayTrace: 60.2EarleyBoyer: 59.7RegExp: TypeError: Cannot find default value for object.java.lang.IllegalStateException
ただし、jrunscriptはうまく改行されないのと、RegExpでIllegalStateExceptionで終了してしまうので、それ以降の値を比較できない。
-Xmxを指定しているのは、OOMが起きてしまうから。もっと少なくてもいいかもしれない。