JythonをGroovyServで実行してみる

気がついたらTwitterでid:t-wadaからふられてた*1のでやってみました。

$ alias gython="groovyclient -cp /tmp/jython.jar -e 'import org.python.util.jython; jython.main(args)' --"

こんなaliasを書けばそれっぽく動きました。jython.jarは自分の環境に合わせてください。

$ time jython -c "print('hoge')"
hoge

real    0m2.503s
user    0m2.891s
sys     0m0.431s

$ time jython -c "print('hoge')"
hoge

real    0m2.613s
user    0m2.889s
sys     0m0.435s

$ time gython -c "print('hoge')"
hoge

real    0m0.959s
user    0m0.001s
sys     0m0.003s

$ time gython -c "print('hoge')"
hoge

real    0m1.156s
user    0m0.001s
sys     0m0.003s

1秒ちょっとくらいは縮まっているみたいですね。

追記

毎回クライアントから使い捨てクラスパスを通すオーバヘッドがあれなので、あらかじめgroovyserverを起動するときに環境変数CLASSPATHjython.jarを通してロードしておいたら早くなるかも。

やってみます。*2

$ alias gython="groovyclient -e 'import org.python.util.jython; jython.main(args)' --"
$ export CLASSPATH=/tmp/jython.jar
$ groovyserver -r

これでgroovyserverプロセスの共通クラスパスとしてjython.jarがロードされるので(たぶん初回利用時にロードするので、2回目以降が早くなる)、毎回読み込み直すオーバーヘッドがなくなるはず。

$ time gython -c "print('hoge')"
hoge

real    0m0.909s
user    0m0.001s
sys     0m0.002s

$ time gython -c "print('hoge')"
hoge

real    0m0.076s
user    0m0.001s
sys     0m0.003s

$ time gython -c "print('hoge')"
hoge

real    0m0.045s
user    0m0.001s
sys     0m0.003s

劇的に早くなった!

だけど、テストとか込み入ったライブラリがきちんと動くどうかは保証できないので、そこはひとつ自己責任でお願いします。

追記2

それから、Windowsな人はGroovyとGroovyServをインストールするときzip版を使ってください。Windowsインストーラ版もあるんですがどうもバイナリがおかしいようで、エラーが出まくって無駄にハマります。

追記3 (6/6 10:30)

今のところ自分の.bashrcには↓と登録してみてます。
個人的にはあまり使わないので、問題があっても気づけませんけど、ご参考までに。
個々のスクリプト実行時の性能を重視して、サーバプロセス起動時に必要なjarをCLASSPATHに通すようにしてます。
おまけでclojure用の設定もつけておきました。clojure派な人もどうぞ*3

両刀遣いな人は、もちろん二つのjarをCLASSPATHに通したaliasを作ってもOKです。

alias glojureserver="env CLASSPATH=/usr/local/Cellar/clojure/1.2.0/clojure.jar groovyserver"
alias glojure="dgroovyclient -e 'import clojure.main;main.main(args)' --"
alias gythonserver="env CLASSPATH=/usr/local/Cellar/jython/2.5.2/libexec/jython.jar groovyserver"
alias gython="groovyclient -e 'import org.python.util.jython; jython.main(args)' --"

使い方:

$ glojureserver -r -v
Groovy command path: /usr/local/bin/groovy (found at PATH)
GroovyServ home directory: /usr/local/Cellar/groovyserv/0.7/libexec
Original classpath: /usr/local/Cellar/clojure/1.2.0/clojure.jar
GroovyServ default classpath: /usr/local/Cellar/clojure/1.2.0/clojure.jar:/usr/local/Cellar/groovyserv/0.7/libexec/lib/*
Killed groovyserver of 56789(1961)
Restarting groovyserver
Starting....
groovyserver 59802(1961) is successfully started

$ time glojure -e "(println 'hoge)"
hoge

real    0m0.867s
user    0m0.001s
sys     0m0.004s

$ time glojure -e "(println 'hoge)"
hoge

real    0m0.053s
user    0m0.001s
sys     0m0.004s

$ gythonserver -r -v
Groovy command path: /usr/local/bin/groovy (found at PATH)
GroovyServ home directory: /usr/local/Cellar/groovyserv/0.7/libexec
Original classpath: /usr/local/Cellar/jython/2.5.2/libexec/jython.jar
GroovyServ default classpath: /usr/local/Cellar/jython/2.5.2/libexec/jython.jar:/usr/local/Cellar/groovyserv/0.7/libexec/lib/*
Killed groovyserver of 59802(1961)
Restarting groovyserver
Starting....
groovyserver 59938(1961) is successfully started

$ time gython -c "print('hoge')"
hoge

real    0m1.540s
user    0m0.001s
sys     0m0.004s

$ time gython -c "print('hoge')"
hoge

real    0m0.108s
user    0m0.001s
sys     0m0.003s

$ time gython -c "print('hoge')"
hoge

real    0m0.057s
user    0m0.001s
sys     0m0.004s

*1:http://d.hatena.ne.jp/t-wada/20110605/tddbc_sapporo_2_0

*2:-cpを外したaliasを書き忘れてたので追記しました at 13:30

*3:thanks to http://d.hatena.ne.jp/athos/20110515/clojure_on_nailgun_and_groovyserv