Performance 使用';优化';公告

Performance 使用';优化';公告,performance,lisp,common-lisp,Performance,Lisp,Common Lisp,为了提高Lisp程序的效率,我想在代码中插入以下行: (optimize (speed 3) (safety 0) (debug 0) (space 0)) 目前我认为我应该把它放在每个文件的顶部。这是一个好主意还是我应该在一个特定的地方插入这一行?(我使用ASDF进行系统定义。) 我问题的另一部分是:(安全0)安全吗?我的函数很少使用变量类型的显式声明,其他函数会怎么样?我是否应该省略(安全性0),以避免由于缺少类型检查而可能出现的问题?我将避免全局设置编译策略,因为。如果确实要对每个文件使

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

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


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

我将避免全局设置编译策略,因为。如果确实要对每个文件使用全局策略,可以在顶级使用(顶级
本地
的子表单仍然是顶级表单)

而不是

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

(proclaim '(optimize speed #| ... whatever ... |#)) 
我倾向于少用声明,通常只在函数中使用局部声明,即

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

许多现代Lisp编译器(如SBCL)已经非常擅长计算类型。此外,我不会在全球范围内使用
(安全0)
,因为这可能会很危险,尤其是在开发过程中,当事情还没有真正解决,错误也很常见时。

您可以查看Edi Weitz处理优化声明的来源和方式。我似乎记得这是一个有趣的方法。@Joshua,谢谢你!这个Lisp代码对我来说是一个很好的例子。它还使用ASDF,现在我看到了一些我应该采用的小细节。优化声明确实很聪明:-)找到了!我很高兴它有用!老实说,我不太记得当时的方法是什么,只是当我看到它时,我的反应是“嗯?这是干什么的?…哦…太好了!”@Joshua,他定义了一个变量,它保存所需的设置,然后将
(声明#.*标准优化设置*)
放在需要的地方。我想我现在会使用
#.
补码等函数,在编译时而不是运行时获得结果。在函数
declaim
ed
内联
中使用
优化
声明有意义吗?坦白地说,我不知道。标准并没有真正定义编译器在给定的优化策略下应该做什么。如果您真的很麻烦的话,您应该阅读Lisp实现的文档。
(defun compute-foo (x)
   (declare (fixnum x))
   (1+ x))