#3 たらい回してみた

半端に compile するだけでもだいぶマシだけど、それでも200倍か・・・。

-- (tak 12 6 0) (tak 12 6 1) 遅さ
defun 0.203 0.063 ---
defmethod 508.641 128.438 2505, 2038
defmethod(compile 後) 46.25 12.204 227, 193
;;; 生の xyzzy-lisp
(defun tak (x y z)
  (if (<= x y) z
    (tak (tak (1- x) y z)
         (tak (1- y) z x)
         (tak (1- z) x y))))
=> tak

;;; compile はしてない

(time (tak 12 6 0))
=> 0.203

(time (tak 12 6 1))
=> 0.063
;;; closette で defmethod
(defgeneric tak (x y z))
=> #<Standard-Generic-Function tak >
(defmethod tak ((x number) (y number) (z number))
  (if (<= x y) z
    (tak (tak (1- x) y z)
         (tak (1- y) z x)
         (tak (1- z) x y))))
=> #9=#<Standard-Method tak (number number number) >

(time (tak 12 6 0))
=> 508.641

(time (tak 12 6 1))
=> 128.438
;;; 中途半端に compile してみる
(do-symbols (sym #1=(find-package :closette))
  (when (and (eq (symbol-package sym) #1#)
             (fboundp sym))
    (format t "compiling ~S...~:[failed~:;done~]~%"
            sym (ignore-errors sym))))
compiling closette::canonicalize-direct-superclasses...done
;; 以下略
=> nil

(defgeneric tak (x y z))
=> #12=#<Standard-Generic-Function tak >

(defmethod tak ((x number) (y number) (z number))
  (if (<= x y) z
    (tak (tak (1- x) y z)
         (tak (1- y) z x)
         (tak (1- z) x y))))
=> #9=#<Standard-Method tak (number number number) >

(time (tak 12 6 0))
=> 46.25

(time (tak 12 6 1))
=> 12.204