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