fu7mu4’s diary

はてなダイアリーから移転しました。

sbclの最適化に失敗

sbcl の最適化がうまくいかない。 Juliaの紹介で、比較としてcommon lisp再帰定義でフィボナッチ数を計算させて処理速度を測ってみたのだがsbclで思ったように速度が早くならない。

フィボナッチ数 50 のベンチマーク用だから fixnumではなく、bignum ってのがいけないのかもしれない。

オリジナル

````lisp (defun fibo(n) (if (< n 2) n (+ (fibo (- n 1)) (fibo (- n 2)))))

(defun main () (format t "~a~%" (fibo (parse-integer (nth 1 sb-ext:posix-argv)))))

(sb-ext:save-lisp-and-die "fibosbclwopt" :toplevel #'main :executable t) ````

高速化したはず

````lisp (declaim (ftype (function (bignum) (values bignum &optional)) fibo)) (defun fibo(n) (declare (optimize speed)) (the bignum (if (< n 2) n (+ (fibo (- n 1)) (fibo (- n 2))))))

(defun main () (format t "~a~%" (fibo (parse-integer (nth 1 sb-ext:posix-argv)))))

(sb-ext:save-lisp-and-die "fibosbclwopt" :toplevel #'main :executable t) ````