为了提高我的Lisp程序的效率,我想在我的代码中插入这一行:
(optimize (speed 3) (safety 0) (debug 0) (space 0))
目前我认为我应该把它放在每个文件的顶部。这是一个好主意还是应该在一个特定的地方插入这一行? (我使用ASDF进行系统定义。)
我的问题的另一部分:(safety 0)
安全吗?我的函数很少使用变量类型的显式声明,其他函数会发生什么?我是否应该省略(safety 0)
以避免因缺少类型检查而可能出现的问题?
答案 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)
,因为它可能是危险的,特别是在开发期间,事情还没有真正解决并且错误很常见。