Gauche が速い件 - Scheme VM を書く
今回、+ と = を VM の instruction にしたので速度比較をします。
コードは以下のようなもの。(named let の展開形のようなもの)
((lambda (a) (set! a (lambda (i) (if (= i 2000000) i (a (+ i 1))))) (a 0) ) '())
初めて作ったインタプリタの実行速度を 1 として比較。
初めて作った Schemeインタプリタ | 1 |
---|---|
Perl | 4.13 |
=/+ が VM の instruction ではない Scheme VM | 5.1 |
= が VM の instruction になった Scheme VM | 9.1 |
=/+ が VM の instruction になった Scheme VM | 42.8 |
Gauche | 107.5 |
Gauche はええええ。でもまだ速くなりそうなところがあるのでがんばるよ。
おまけで Perl もつけましたがコードがそもそも Scheme にとって有利なコードなのでフェアではありません。
sub a { my $i = shift; if ($i == 2000000) { return $i; } else { f($i + 1); } } a(0);
あと Ruby は `f': stack level too deep (SystemStackError) とか言われた。
これはしょうがないと思う。Rubyのスタイルとして想定されていないコードだし。
あ。YARVには末尾呼び出しの最適化が入るらしいのでクリスマスにもう一度試そう。