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を起動するときに環境変数CLASSPATHにjython.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