【发布时间】:2012-07-21 11:43:43
【问题描述】:
到目前为止,在测试编写相同函数的不同方法的速度时,我一直在使用 time 函数,通常它可以很好地指示不同函数的相对速度(因为它们通常不同大约 100k 个周期)。
在尝试为factorial 函数寻找最快的方法时,time 一直缺乏。这些方法不仅看起来只相差 10k-30k 个周期,而且它们的总时间也相差了大约一半(我猜这是预期的)。
factorial 的三个函数:
(defun factorial-recusion (n) ; 1st
(if (equal n 1)
1
(* n (factorial (- n 1)))))
(defun factorial-loop (n) ; 2nd
(let ((solution 1))
(loop for x from n downto 2
do (setf solution (* solution x))
finally (return solution))))
(defun factorial-do (n) ; 3rd
(let ((solution 1))
(do ((x n (1- x)))
((< x 2) (return solution))
(setf solution (* solution x)))))
所以,我想我有两个问题:
1.) factorial 的哪种方法应该是最快的(如果有的话),为什么?
2.) 如果我要通过一般方法为自己找出更快的功能,那么最好的方法是什么(出于某种原因,我认为 LOC 是速度的不良指标)?或许有办法查看 Lisp 字节码的反汇编?或者也许有更好、更严格的方法?
我目前在 Ubuntu 12.04 x86-64 上运行 Linux 3.2.0-26、SBCL。
【问题讨论】:
-
你使用的是什么 CL 实现?
标签: performance lisp common-lisp sbcl factorial