如果您使用 defstruct 插槽选项`:type`,那么您是否消除了运行时检查?

aSp*_*old 0 performance common-lisp

我正在学习 Common Lisp,我想知道是否通过使用 a 中的:type插槽来defstruct提高代码效率?

在“人工智能编程范式”中,Peter Norvig 写道,通过适当的声明,您可以使 Common Lisp 程序与 C 程序一样高效。他写道,Common Lisp 中的运行时类型检查很慢,但如果您添加声明,则可以消除运行时检查。

所以,我知道使用:type插槽类似于变量的声明,所以我想知道使用是否:type会使代码更快(即消除运行时检查)。

这里有些例子:

(defstruct matrix
   rows 
   columns 
   contents)
Run Code Online (Sandbox Code Playgroud)

这是带有以下内容的版本:type

(defstruct matrix
   rows 
   columns 
   contents)
Run Code Online (Sandbox Code Playgroud)

那么 using 可以:type消除运行时检查吗?或者如果有可能你如何使用:type来消除运行时检查?

我正在 Common Lisp 中研究线性代数系统,我想让它变得高效。因此,我想知道通过执行(如上)(contents (:type list))编译器是否要消除编译器在内容未声明为列表时会执行的运行时检查。

谢谢

Rai*_*wig 8

首先想到的是这增加了一个运行时检查。现在运行时可能会在每次更改插槽时检查更改是否与声明的类型兼容。所以添加这样的类型声明会使代码变慢,因为它默认会添加运行时检查。但这取决于编译器和 Lisp 运行时的能力。

Common Lisp 具有编译质量:速度、调试、安全、空间和编译速度。个别的 Common Lisp 实现可能有额外的品质

在某些情况下,为插槽添加类型声明可能会有所帮助:

  • 假设我们有一个函数foo,它有一个参数:一个浮点数。该函数将数字加 1.0。

  • 那么我们可能有一个结构对象,它有一个槽n,它被声明为单浮点型

(foo (struct-n some-struct))如果某种质量组合使编译器在编译时推断和检查类型,则该操作可能会省略检查:然后它可能知道这些都是单浮点计算并且可以在编译时确定 -> 它将生成单浮点指令,将省略运行时类型检查。

一个好的编译器(如 SBCL)可能会告诉我们它已经完成了这样的优化(或者由于某种原因它不能这样做)。所以从那里我们可能知道运行时类型检查还没有生成到编译的代码中。

还可以使用该函数DISASSEMBLE查看生成的代码是否包含类型检查。