Gambit Scheme その4: 宣言文による最適化を検証する
「Marc Feeley教授によるGambit Schemeの実装」の続き。
参照: http://www.iro.umontreal.ca/~gambit/Gambit-inside-out.pdf (23mのPDFファイル)
スライドに出ていた高速化をやってみた。ついでに幾つかの言語も加えてみた。
アルゴリズムは定番のFibonacci。
(declare (standard-bindings))
(declare (block))
(declare (fixnum))
(declare (not safe))(define (fib n)
(if (< n 2)
n
(+ (fib (- n 1))
(fib (- n 2)))))(print (fib 40) "\n")
(exit)
gsi | 226.34 |
gsc plain | 12.19 |
gsc (standard-bindings) | 9.43 |
gsc (standard-bindings) (block) | 6.70 |
gsc (standard-bindings) (block) (fixnum) | 5.56 |
gsc (standard-bindings) (block) (fixnum) (not safe) | 2.05 |
perl | 369.47 |
python | 142.21 |
js rhino | 105.95 |
lua | 69.95 |
v8 javascript | 6.32 |
java -server -dsa | 1.81 |
C -O3 | 1.19 |
このような安易なマイクロベンチーマークから言語の性能を判断することは無理だが参考にはなる。
V8 javascriptはさすがに速い。「研究させすればダイナミック言語も速くなる」というYeggeの予言が的中した形だ。しかもjavascriptという彼が選択した言語で。下のRecursiveFibBenchテストではV8は更に速い数字を出している。チューニングの余地ありか。
JavaのスピードはCに迫ようになったとよく言われるが、本当にそのようだ。このような短いランではスタートアップが足を引っ張っているかもしれない。
さて肝心のgambitだが、コンパイルした時点で、一般スクリプト言語より数倍速い。さらに、幾つかのフラッグを与えるだけで、Cのパフォーマンスの6割にまで迫る。Cの「数倍」単位で計られるダイナミックな言語のパフォーマンスとしては圧倒的な数字だ。
さらにREPLでインタラクティブに開発してCやJavaに近いパフォーマンスで稼働できるというのも画期的だ。ClojureやSBCLでもそういう可能なのかもしれないが、大きなランタイムに依存せず、ネィティブなプログラムとして出荷できるとう点では他に類を見ない言語ではないだろうか。
言語自体の機能としては、唯一マルチコアサポートにおいてClojureなどJavaVMの言語に劣ることになるのかもしれない。 だが強力な分散処理機能を備えているので、多くのケースで対応できそうな気がする。最大の弱点はライブラリやフレームワークにおけるサポートだ。これを克服するぐらいの思い入れがあればgambit schemeは強力武器になる。
これで次覚える言語の候補はgambitとclojureに絞られた。Javaエコシステムに無知でネイティブが好きなテングとしてはgambitに傾いている。と思っていたらこのようなライブラリが出たりするので迷ってしまう…
似たようなテスト
このテストをマックで徹底的にやった結果を公開した人がいる。
https://github.com/lp/RecursiveFibBench/blob/master/bench_results.txt
「w/objc」ってのは多分ネイティブの拡張モジュールを使ったものだろうか?どちらにしよマック特有のものだろう。これを除くとv8-jsがCに迫っている。
環境、言語バージョン
Linux 2.6.28-11-generic #42-Ubuntu SMP Fri Apr 17 01:57:59 UTC 2009 i686 GNU/Linux
/usr/local/Gambit-C/bin/gsi -v
v4.6.0 20100115040636 i686-pc-linux-gnu "./configure --enable-single-host"
make fib_scm
/usr/local/Gambit-C/bin/gsc -c fib.scm
/usr/local/Gambit-C/bin/gsc -link fib
gcc -o fib_scm -O3 fib_.c fib.c -lgambc -lm -ldl -lutil
$ java -version
java version "1.6.0_0"
OpenJDK Runtime Environment (IcedTea6 1.4.1) (6b14-1.4.1-0ubuntu12)
OpenJDK Client VM (build 14.0-b08, mixed mode, sharing)
$ v8js -h
V8 version 2.0.3 [console: dumb]
gcc --version
gcc (Ubuntu 4.3.3-5ubuntu4) 4.3.3
perl -v
This is perl, v5.10.0 built for i486-linux-gnu-thread-multi
$ python
Python 2.6.2 (release26-maint, Apr 19 2009, 01:56:41)
[GCC 4.3.3] on linux2
$ dpkg -l | grep -i rhino
ii rhino 1.7R1-2 JavaScript engine written in Java