Performance Lisp:度量函数的性能

Performance Lisp:度量函数的性能,performance,lisp,common-lisp,sbcl,factorial,Performance,Lisp,Common Lisp,Sbcl,Factorial,到目前为止,在测试编写同一函数的不同方法的速度时,我一直在使用time函数,通常它可以很好地指示不同函数的相对速度(因为它们通常相差约100k个周期) 然而,在试图为阶乘函数找到最快的方法时,却缺少时间。不仅这些方法的差异似乎只有10k-30k周期,而且它们的总时间也有大约一半的差异(我猜这是预期的) 三个factorial函数: (defun factorial-recusion (n) ; 1st (if (equal n 1) 1 (* n (

到目前为止,在测试编写同一函数的不同方法的速度时,我一直在使用
time
函数,通常它可以很好地指示不同函数的相对速度(因为它们通常相差约100k个周期)

然而,在试图为
阶乘
函数找到最快的方法时,却缺少
时间
。不仅这些方法的差异似乎只有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)))))
(defun阶乘递归(n);第一
(如果(等于n1)
1.
(*n(阶乘(-n1(())))
(defun阶乘循环(n);第二
(让((方案1))
(x从n向下循环到2
do(setf溶液(*溶液x))
最后(返回解)))
(defun阶乘do(n);3
(让((方案1))
(do((xn(1-x)))
((
所以,我想我有两个问题:

1.
factorial
的哪种方法应该是最快的(如果有),为什么

2.)如果我想通过一般方法为自己找到更快的函数,那么最好的方法是什么(出于某种原因,我认为LOC是一个糟糕的速度指示器)?也许有一种方法可以查看Lisp字节码的反汇编?或者有更好更严格的方法


我目前正在Ubuntu 12.04 x86-64上运行Linux 3.2.0-26 SBCL。

SBCL不编译为“字节码”。它编译为本机机器代码

可以使用
反汇编
反汇编Lisp函数

一旦数字进入bignum范围,阶乘函数的速度由bignum算术乘法控制

更清楚地说:您使用哪种迭代构造,执行还是循环,并不重要。大部分时间都花在了大块头的乘法上。递归版本也没有多大区别

这是一个典型的基准测试问题:许多简单的数字基准测试主要由一些算术运算(比如bignum的乘法)的运行时控制。它们不会测量一般语言操作(如各种类型的控制流)的速度差异


带有快速bignum库的慢速Lisp可能比使用Lisp编写bignum代码的优化Lisp编译器要快。

您使用的是什么CL实现?噢,糟糕,我把它放在那里了。起初我写了(和(…)(返回解决方案),但后来我意识到这有多愚蠢。反汇编似乎是我需要的。所以我想这也是衡量性能的最佳方法?你认为我的第一个问题有一个直接的答案吗?谢谢!