打倒 Io Language
Ioが「reasonably fast (comparable to Python, Perl, Ruby)」と言ってる秘密を探るために、ぼちぼちソースを読んでみるが、よくわからない。名前検索で、なんか不思議なことやってたので、そこらへんに秘密があるかと思ったが、それは、parentとprotoのチェインの実装がややこしかっただけで効率とは全然関係無かった。
全体的に見ても、やってることは普通に見える。
完全ハッシュ使ってる、というのは、どのくらい効果があるかは知らんが、そのぐらいの違いだったら、ローカル変数で名前検索を行わない、とか、外側の名前を参照しない関数ではクロージャを作らない、とか、そういう部分で対応すれば、十分に勝てるような気がする。
と、いうわけで、パフォーマンスの目標をとりあえず、「Ioに勝てるくらいまで」、にしとこうかと。やっぱり、基準があったほうがやりやすいし。
で、謎だった構文木を普通の構文木に変更。これで実験で作るインタプリタくらいの速度は出るんではないかと。
フィボナッチ数で、
function fib(n) { if ( n>2 ) { return fib(n-1) + fib(n-2); } return n; } for ( var i=0; i<22; i=i+1 ) { puts( fib(i) ); }
これで1.8secぐらい。Ioだと、
fib := method ( n, if ( n > 2, return fib(n-1) + fib(n-2) ) return n ) for ( i, 0, 22, fib(i) print )
これで…1.9sec…?ん、なんか間違ってるんじゃないか…?
でも、まあ、Ioは数値演算全部doubleでやってるので、そこらへんの影響かもしれない(ちなみにILogScriptは64bit整数)。もっと名前検索のほうに偏ったベンチマークのほうがいいかも。
あー、あと、ILogScriptの浮動小数点はどうするか迷う。ILogScriptの立場上、適当にはできないしなぁ…。