2010年2月23日火曜日

ClojoreとAOT

Excelsior JETを使って、(Sun Hotspot JVMと比較した)Clojureの起動速度を測定してみました。
IBM JVM J9の場合も追記しましたが、こちらはおもに処理速度を向上したい場合に向いているようです。
どちらも、バイナリは、OSXはなく、LinuxとWindowsの32/64bitがあるようです。

Excelsior JET
ベータ版は、最新のベータが存在するときだけ、配布しています。
体験版の有効期限は3か月です。
購入した場合、Windows版で1200.00ドル~ Linux版で、1900.00ドル~です。
日本の正規販売店もあります。

2010年2月時点の最新版は7.0で、ベータ版はありませんでした。
対応するjdk 1.6.0 update 16の場合は、プロファイルが存在するため作成作業が省略できます。

jc clojure.jarを実行すると clojureという実行ファイルができます。
この場合、java -jar clojure.jar に対応します。

IBM J9 JVM
Linuxの場合は、こちらのLinux-Downloadから取得しました。Windows版へは、リンク切れになってます。
Windowsで利用したい場合には、WebSphere Application Server Community Editionにも、少し古いバージョンが含まれていますので、こちらが利用できるようです。

AOTを有効にするには、-Xshareclassesをつけて実行します。
詳細は、こちらの記事や、ユーザーガイド中のSDK およびランタイム・ガイド「JVM 間でのクラス・データの共用」を確認してください。

CentOS5.4にRPMインストールしたところ、libstdc++.5.soが足りないと言われ、
確認したところ、libstdc++.6.so (4.1.2-46)のみあったため、
yum install compat-libstdc++-33.x86_64 compat-libstdc++-33.i386
で、互換ライブラリ(3.2.3-61)をインストールしました。

実行結果は、37%程度のスピードアップが確認できましたが、もともと起動速度がSun Hotspot JVMより遅いため、そちらを越えられませんでした。
ちなみに、安定後のループなどの処理速度はSun JVMより高速なようです。

実行結果
ちなみに、vmware上の CentOS5.4 x86_64 AthlonXP64 2GHz 1coreで、下記のような起動速度になりました。

Excelsior JETでAOT
$ jc clojre.jar
$ time ./clojure -i comment.clj
real 0m0.439s
user 0m0.080s
sys 0m0.142s

通常の起動
$ time java -cp clojure.jar clojure.main -i comment.clj
real 0m1.887s
user 0m1.289s
sys 0m0.170s

通常の起動(JAR)
$ time java -jar clojure.jar -i comment.clj
real 0m1.830s
user 0m1.294s
sys 0m0.157s

インタプリタのみで起動(JITなしで、実行は何倍も遅い)
$ time java -Xint -cp clojure.jar clojure.main -i comment.clj
real 0m1.628s
user 0m1.125s
sys 0m0.171s

J9 JVM AOT
$ time /opt/ibm/java-x86_64-60/jre/bin/java -cp clojure.jar clojure.main -i comment.clj
real 0m3.321s
user 0m1.651s
sys 0m0.242s
$ time /opt/ibm/java-x86_64-60/jre/bin/java -Xint -cp clojure.jar clojure.main -i comment.clj
real 0m2.741s
user 0m1.285s
sys 0m0.173s

$ time /opt/ibm/java-x86_64-60/jre/bin/java -Xshareclasses -cp clojure.jar clojure.main -i comment.clj
real 0m2.424s
user 0m0.991s
sys 0m0.165s

$ time /opt/ibm/java-x86_64-60/jre/bin/java -Xint -Xshareclasses -cp clojure.jar clojure.main -i comment.clj
real 0m2.149s
user 0m0.835s
sys 0m0.109s

ソフトウエアのバージョン
$ cat /etc/redhat-release
CentOS release 5.4 (Final)

$ java -version
java version "1.6.0_16"
Java(TM) SE Runtime Environment (build 1.6.0_16-b01)
Java HotSpot(TM) 64-Bit Server VM (build 14.2-b01, mixed mode)

$ java -jar clojure.jar -e '(println *clojure-version*)'
{:major 1, :minor 1, :incremental 0, :qualifier }

$ jc|head -n 2
Excelsior JET v7.0 Evaluation Version (c) Excelsior 1997,2009
Active Java SE Version 1.6.0_16 (profile 16)

$/opt/ibm/java-x86_64-60/bin/java -version
java version "1.6.0"
Java(TM) SE Runtime Environment (build pxa6460sr7-20091215_02(SR7))
IBM J9 VM (build 2.4, JRE 1.6.0 IBM J9 2.4 Linux amd64-64 jvmxa6460sr7-20091214_49398 (JIT enabled, AOT enabled)
でした。

0 件のコメント :