我粗略地阅读了 inlining declamations 并阅读了 relevant CLHS pages ,但不容易看到明确的答案。
当使用 (declaim (inline foo))
而不是 foo
声明 defmethod
时,defun
是否合理(后者明确是涵盖的情况)?如果 foo
是 reader
的 class
函数呢?这种内联的效果在性能方面是否明显?它在某种程度上是特定于实现的吗?
对于严格约束下的简单方法,为了性能而重写为 defun
可能是合理的,但这有时很困难或不可能。有没有通用的优化策略可以在不将它们重新编写为函数的情况下对 Common Lisp 方法产生影响?
最佳答案
内联方法没有多大意义,因为当 CL 编译器可以提前确定正在调用什么函数时,它可以这样做。当显式调用 (foo x)
并内联 foo
时,可以替换 foo
的定义。但是,当正在编译的代码是 (funcall method x y)
时,如果 method
未知,则无法内联该函数。
这就是泛型函数所做的。实际上,您不是自己调用方法,而是让对象系统决定应该调用哪些方法。 CLOS 允许您添加和删除方法,因此您必须接受这样一个事实,即系统是动态的并且有一些运行时成本(显然,某些实现可以密封通用函数以防止进一步更改)。但是,它在实践中非常有用,并且可以节省大量开发时间。我还没有找到动态调度成本过高的情况,但我没有使用非常大的方法集的经验。
您可以查看 Robert Strandh 的论文 Fast generic dispatch for Common Lisp 以了解有关使泛型调度更快的想法。
还有一个提供 Inlined Generic Functions 的库,显然通用函数可以在适当的情况下在编译时有效地分派(dispatch)。
关于performance - `inline` 是否有可能是 `method` ?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41128996/