使用“优化”声明

Mar*_*ark 4 lisp performance common-lisp

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

(optimize (speed 3) (safety 0) (debug 0) (space 0))
Run Code Online (Sandbox Code Playgroud)

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

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

Dir*_*irk 5

我会避免全局设置编译策略,因为“与其他定义宏一样,未指定声明的编译时副作用在文件编译后是否持续存在”。如果你真的想对每个文件使用全局策略,你可以在顶级使用locally特殊表单(顶级的子locally表单仍然是顶级表单)

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

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

   (defun compute-bar (y) 
     (* (compute-foo y) y)))
Run Code Online (Sandbox Code Playgroud)

代替

(declaim (optimize speed #| ... whatever ... |#))
...
Run Code Online (Sandbox Code Playgroud)

甚至

(proclaim '(optimize speed #| ... whatever ... |#)) 
Run Code Online (Sandbox Code Playgroud)

我倾向于谨慎地使用声明,通常只在函数内使用局部声明,即,

(defun compute-foo (x)
   (declare (fixnum x))
   (1+ x))
Run Code Online (Sandbox Code Playgroud)

许多现代 Lisp 编译器(如 SBCL)已经非常擅长识别类型。此外,我永远不会(safety 0)全局使用,因为它可能很危险,特别是在开发过程中,当事情还没有真正稳定下来并且错误很常见时。