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