使用'优化'公告

时间:2014-07-01 07:11:51

标签: performance lisp common-lisp

为了提高我的Lisp程序的效率,我想在我的代码中插入这一行:

(optimize (speed 3) (safety 0) (debug 0) (space 0))

目前我认为我应该把它放在每个文件的顶部。这是一个好主意还是应该在一个特定的地方插入这一行? (我使用ASDF进行系统定义。)

我的问题的另一部分:(safety 0)安全吗?我的函数很少使用变量类型的显式声明,其他函数会发生什么?我是否应该省略(safety 0)以避免因缺少类型检查而可能出现的问题?

1 个答案:

答案 0 :(得分:2)

我会避免在"as with other defining macros, it is unspecified whether or not the compile-time side-effects of a declaim persist after the file has been compiled"之后全局设置编译策略。如果您确实要为每个文件使用全局政策,则可以使用顶级locally special form(顶级locally的子表单保留顶级表单)

(locally (declare (optimize speed #| ... whatever ... |#))

   (defun compute-foo (x) 
     (1+ x))

   (defun compute-bar (y) 
     (* (compute-foo y) y)))

而不是

(declaim (optimize speed #| ... whatever ... |#))
...

甚至

(proclaim '(optimize speed #| ... whatever ... |#)) 

我倾向于谨慎使用声明,通常只在函数中使用声明,即

(defun compute-foo (x)
   (declare (fixnum x))
   (1+ x))

许多现代的Lisp编译器(如SBCL)已经非常擅长计算类型。此外,我从不在全球范围内使用(safety 0),因为它可能是危险的,特别是在开发期间,事情还没有真正解决并且错误很常见。