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)
でした。

2010年2月14日日曜日

Clojure-CLR 1.1.0をVisual C# 2008 Express Edition SP1でビルドするのに用意したものをメモ

GitHubにClojure 1.1.0のCLR実装(ClojureCLR 1.1.0)が用意されているので、インストール手順を見ながらVisual C# 2008 Express Edition SP1で、ビルドしてみた。

準備
まずは、開発環境から、アセンブリとソースのディレクトリ構成まで整える。
開発環境
DL Visual C# 2008 Express Edition with SP1 もしくは、Visual Studio 2008 SP1
SP1について
http://www.microsoft.com/japan/msdn/vstudio/downloads/sp/vs2008/sp1/
必要なアセンブリ(インストールするもの)
DL Microsoft .NET Framework 3.5 SP1 (Full packege版)
DL NUnit 2.5.2
必要なアセンブリ(配置するもの)
DL Rhino Mocks 3.5 - For .Net 3.5 (with Castle assemblies)
ビルドに必要なソースファイル
DL Clojure-CLR 1.1.0
DL Microsoft Dynamic Language Runtime Change Set 38141あたり

フォルダ構成
dev\
- richhickey-clojure-clr-ee572b9\ (名前を変えてもOK)
- DLR_Main\
- RhinoMocks\

・devフォルダにDynamic Language Runtimeと、Clojure-CLRをフォルダごと配置
・devフォルダにRhinoMocksフォルダを作成して、ファイルをコピー

プロジェクトのビルド
・richhickey-clojure-clr-ee572b9\ClojureフォルダのClojureCLR.slnというソリューションファイルをVisual Studioもしくは、Visual C#で開く。
・Runtimeが構成できないというポップアップウインドウを無視する。
・そのまま、ビルドからソリューションのビルドを実行する。
・ビルドが終わると、richhickey-clojure-clr-ee572b9\Clojure\Clojure.Main\bin\Debugフォルダ内に、コンパイラ(Clojure.Compile.exe)とREPL(Clojure.Main.exe)ほか関連ファイルが用意される。

ClojureCLRを実行する
Clojure.Main.exeを実行すれば、java -cp clojure.jar clojure.mainと同じようにREPL(対話型評価環境)が起動する。
・CLR環境では、CLASSPATHのかわりに環境変数clojure.load.pathが用意されている。
設定したパス内の*.clj.dllと*.cljをさがす。
参考:Running ClojureCLR

そのほか
・Simple.Console.exeの使い方→Running ClojureCLR
・CLR,C#の呼び出し→CLR Interop, Completing CLR interop
・CLRに合わせたclojure.coreの変更→Translating core.clj
・未実装の機能やclojure.contribについて→ToDo
やはりJava呼び出ししているところの書き換えが必要なようです。
Wikiは、進行状況に合わせて変更されている。
ビルドテストは、
(require '(clojure [test-clojure :as main]))
(main/run)
Testing clojure.test-clojure.data-structuresで、2エラーありました。
・Clojure.Source.dllやClojure.Tests.dllはなんだ?