我已经对inlining declamations做了一些粗略阅读并阅读了relevant CLHS pages,但却无法轻易看到明确的答案。
(declaim (inline foo))
使用foo
而不是defmethod
声明defun
时是否合理(后者明确是一个涵盖的案例)?如果foo
是reader
的{{1}}函数,那该怎么办?这种内联的效果在性能方面是否明显?它是否以某种方式特定于实现?
对于在严格约束下的简单方法,可能有理由重新编写为class
的性能,但这有时很难或不可能。是否有一般的优化策略可以使用Common Lisp方法,而不将它们重写为函数?
答案 0 :(得分:3)
内联方法没有多大意义,因为CL编译器可以在事先确定调用哪个函数时可以这样做。当(foo x)
显式调用内联foo
时,可以替换foo
的定义。但是,当编译的代码是(funcall method x y)
时,如果method
未知,则无法内联函数。
这就是通用功能所做的。实际上,您不是自己调用方法,而是让对象系统确定应该调用哪些方法。 CLOS允许您添加和删除方法,因此您必须忍受系统是动态的并且具有一些运行时成本的事实(某些实现可以密封通用功能,显然,以防止进一步的更改)。但是,它在实践中非常有用,节省了大量的开发时间。我还没有找到一个动态调度成本太高的情况,但我没有很多方法的经验。
您可以查看Robert Strandh的论文Fast generic dispatch for Common Lisp,了解有关更快地进行通用派遣的建议。 还有一个提供Inlined Generic Functions的库,在适当的情况下,可以在编译时有效地发送显式泛型函数。