Fib のベンチマーク
http://d.hatena.ne.jp/nagashimatena/20080215#p1
で面白そうなことをやっているので、kuzha でもやってみた。関数を与えると、その関数を実行して実行時間 ms を返す関数 bench をでっち上げて……
ku> fib = ^x (x <= 1 ? 1 : (fib: x - 1) + (fib: x - 2)); > puts: (fib: 30); > 1346269 ku> for i in [0..9] do > puts: (bench: ^do fib: 30; end) + " ms"; > end > 2069 ms 2077 ms 2076 ms 2079 ms 2102 ms 2104 ms 2073 ms 2157 ms 2106 ms 2130 ms
Core2Duo 2.0GHz で実行すると、2100ms = 約2秒くらいで答えが返ってくる。
関数呼び出し時に実行時コンテキストとか引数用の配列を毎回 new しているから、まあこのくらいだろう。改善の余地は多いけど、並外れて遅いという印象は……とりあえずは無かったりする。
nagashima さんの PJ が遅いのは、おそらくインスタンス生成……を含むメモリ周りの挙動に引きずられている気がします。最新版のソース見ていないので何ともいえませんが……。とりあえず TPTP なり HPjmeter なり hprof+PerfAnal でプロファイル取って、非常に大量の空間を占めるインスタンスを特定するのが近道かなと思っています。
ちなみに、自分も kuzha の前に作った俺言語が低速すぎて涙を流した経験があります。その時に大量の空間を占めていたのが、HashMap 内部のエントリ配列でした。おおよそ全メモリ空間の6割を占めてまして……。元々特殊な評価を行う処理系でして、HashMap の使用はどうしても回避しきれなかったので、結局お蔵入りとなってしまった過去があったりします orz