#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