SBCL优化:函数类型声明

时间:2017-09-19 10:00:53

标签: optimization lisp common-lisp sbcl

如果我有一个接受函数参数的函数,为了优化,我可以将它声明为function,让我们说

(defun foo (f)
   (declare (type function f))
   ...)

然而,我可以更具体:

(defun foo (f)
   (declare (type (function (double-float) double-float) f))
   ...)

即。告诉f将接受一个double-float参数并返回一个double-float值。然而,SBCL似乎能够对前者进行更好的优化,对于后者,它表示它不知道f是否fdefinition(尝试用{{1编译)声明重现)。

所以,我的问题是:

  • 我做错了吗?特别是如果SBCL只对(optimize (speed 3))function做同样的事情,我会很好,但它实际上会更糟。或者它应该被视为SBCL中的错误?

  • 由于某种原因,函数类型声明在CL中通常无用吗?

SysInfo:SBCL 1.3.18

1 个答案:

答案 0 :(得分:1)

从SBCL手册(4.2.3运行现有程序):

  

某些不正确的声明只能通过运行时类型检测到   检查[...]因为SBCL编译器做得更多   类型推断比其他Common Lisp编译器, 所以不正确   声明可以造成更多伤害

这是可能的,这就是为什么你的函数在包含变量类型声明的情况下会变得更糟。

此外:

  

最常见的问题是变量的初始值恒定   与类型声明不匹配。不正确的常量初始值   将始终由编译时类型错误标记,它们是   一旦定位就很容易修复。请考虑以下代码片段:

 (prog (foo)
   (declare (fixnum foo))
   (setq foo ...)
   ...) 
     

这里foo的初始值为nil,但声明为fixnum。即使它永远不会读,a的初始值   变量必须与声明的类型匹配。有两种方法可以解决这个问题   问题。更改声明

 (prog (foo)
   (declare (type (or fixnum null) foo))
   (setq foo ...)
   ...) 
     

或更改初始值

 (prog ((foo 0))
   (declare (fixnum foo))
   (setq foo ...)
   ...)

这是来自当前版本的SBCL(1.4)的手册,因此它可能适用于您的情况,也可能不适用。