フィボナッチ数を計算する
…イヤ,そんなことは,始めから,わかっていたことだ。末尾呼び出しの最適化のない etolisp には無理だろうってことくらい。sbcl にだって,無いんだから。いいじゃないか。そんなところで勝負したって,詮無いことだ。
(defun fib (n) (if (< n 2) n (+ (fib (- n 1)) (fib (- n 2))))) (fib 25)
SBCLだと2秒くらい。エテ公で実際にやってみたらどうなるのか,恐る恐る試してみた。
% time ../src/etolisp fib.lisp GC::collect() begin... (node=1461090) 1460409 nodes (16771KB) are deleted. GC::collect() end. (node=681) GC::collect() begin... (node=1461621) 1460960 nodes (16777KB) are deleted. GC::collect() end. (node=661) ../src/etolisp fib.lisp 45.50s user 1.42s system 85% cpu 54.827 total
m9(^Д^)プギャー,とか言わないように。でも悲しいなぁ。明日はふて寝しよう。
追記:悔しいから fib は C で実装した。etolisp は標準で fib が使えます。大人げない大人の対応ですまんね。
% time ./etolisp ../test/fib.lisp GC::collect() begin... (node=473) 473 nodes (3KB) are deleted. GC::collect() end. (node=0) ./etolisp ../test/fib.lisp 0.02s user 0.01s system 43% cpu 0.066 total