是否可以“内联”一个`方法`?

时间:2016-12-13 19:23:55

标签: performance methods common-lisp inline

我已经对inlining declamations做了一些粗略阅读并阅读了relevant CLHS pages,但却无法轻易看到明确的答案。

(declaim (inline foo))使用foo而不是defmethod声明defun时是否合理(后者明确是一个涵盖的案例)?如果fooreader的{​​{1}}函数,那该怎么办?这种内联的效果在性能方面是否明显?它是否以某种方式特定于实现?

对于在严格约束下的简单方法,可能有理由重新编写为class的性能,但这有时很难或不可能。是否有一般的优化策略可以使用Common Lisp方法,而不将它们重写为函数?

1 个答案:

答案 0 :(得分:3)

内联方法没有多大意义,因为CL编译器可以在事先确定调用哪个函数时可以这样做。当(foo x)显式调用内联foo时,可以替换foo的定义。但是,当编译的代码是(funcall method x y)时,如果method未知,则无法内联函数。

这就是通用功能所做的。实际上,您不是自己调用方法,而是让对象系统确定应该调用哪些方法。 CLOS允许您添加和删除方法,因此您必须忍受系统是动态的并且具有一些运行时成本的事实(某些实现可以密封通用功能,显然,以防止进一步的更改)。但是,它在实践中非常有用,节省了大量的开发时间。我还没有找到一个动态调度成本太高的情况,但我没有很多方法的经验。

您可以查看Robert Strandh的论文Fast generic dispatch for Common Lisp,了解有关更快地进行通用派遣的建议。 还有一个提供Inlined Generic Functions的库,在适当的情况下,可以在编译时有效地发送显式泛型函数。