首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SBCL优化:函数类型声明

SBCL优化:函数类型声明
EN

Stack Overflow用户
提问于 2017-09-19 10:00:53
回答 1查看 997关注 0票数 3

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

代码语言:javascript
复制
(defun foo (f)
   (declare (type function f))
   ...)

不过,我可以说得更具体一点:

代码语言:javascript
复制
(defun foo (f)
   (declare (type (function (double-float) double-float) f))
   ...)

也就是说,告诉f将接受一个double-float参数并返回一个double-float值。然而,SBCL似乎能够对前者执行更好的优化,而后者则表示它不知道f是否是fdefinition (尝试使用(optimize (speed 3))声明进行编译以进行复制)。

所以,我的问题是:

  • 我做错了什么吗?特别是如果SBCL只对function(function ...)做同样的事情,我会同意的,但实际上它做得更糟。还是应该将其视为SBCL中的一个bug?
  • 函数类型声明在CL中是否由于某种原因而在优化方面毫无用处?

SysInfo: SBCL 1.3.18

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-10-02 09:24:37

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

某些不正确的声明只能通过运行时类型检查来检测.因为SBCL编译器比其他通用Lisp编译器进行更多的类型推断,所以不正确的声明会对造成更大的损害。

这是可能的,这就是为什么您的函数在包含变量类型声明时表现更差的原因。

此外:

最常见的问题是变量的常量初始值与类型声明不匹配。不正确的常量初始值将始终由编译时类型错误标记,并且一旦找到它们就很容易修复。考虑一下这个代码片段: (prog ( foo ) (宣布(固定地址)) (setq foo.)) 在这里,foo被赋予一个初始值为零,但被声明为一个固定值。即使从未读取,变量的初始值也必须与声明的类型匹配。有两种方法可以解决这个问题。更改声明 (prog ( foo ) (声明(类型(或fixnum null) foo)) (setq .).) 或更改初始值。 (prog ((foo 0)) (宣告(fixnum foo)) (setq foo .)

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46297512

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档