;; this file: ;; https://dataswamp.org/~incal/cl/bench/fib.cl ;; ;; original Elisp source: ;; elisp-benchmarks (load "~/public_html/cl/bench/timing.cl") ;; optimized (defun fibn (reps num) (declare (optimize speed (safety 0) (debug 0))) (let ((z 0)) (declare (type (unsigned-byte 53) reps num z)) (dotimes (r reps) (let*((p1 1) (p2 1) ) (dotimes (i (- num 2)) (setf z (+ p1 p2) p2 p1 p1 z) ))) z) ) (defun fibn-entry () (fibn 1000000 80) ) ;; tail recursive (defun fibn-tc (a b count) (if (zerop count) b (fibn-tc (+ a b) a (1- count)) )) (defun fibn-tc-entry () (dotimes (_ 1000000) (fibn-tc 1 0 80) )) ;; naive recursion (defun fibn-rec (n) (cond ((zerop n) 0) ( (= 1 n) 1) (t (+ (fibn-rec (1- n)) (fibn-rec (- n 2)) )))) (defun fibn-rec-entry () (fibn-rec 37) ) (defun fib-all-entry () (timing (fib-entry)) (timing (fibn-tc-entry)) (timing (fibn-rec-entry)) ) (fib-all-entry)