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)
以避免由于缺少类型检查而可能发生的问题吗?
我会避免全局设置编译策略,因为“与其他定义宏一样,未指定声明的编译时副作用在文件编译后是否持续存在”。如果你真的想对每个文件使用全局策略,你可以在顶级使用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)
全局使用,因为它可能很危险,特别是在开发过程中,当事情还没有真正稳定下来并且错误很常见时。