我粗略地阅读了 inlining declamations 并阅读了 relevant CLHS pages ,但不容易看到明确的答案。

当使用 (declaim (inline foo)) 而不是 foo 声明 defmethod 时,defun 是否合理(后者明确是涵盖的情况)?如果 fooreaderclass 函数呢?这种内联的效果在性能方面是否明显?它在某种程度上是特定于实现的吗?

对于严格约束下的简单方法,为了性能而重写为 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/

10-14 13:28
查看更多