Optimization 使用类型声明进行优化的常见Lisp最佳实践
我有一个公共Lisp函数,它合并了两个有序的符号列表,没有重复项(两个有序集): 或者,如我所想,如果还需要在我的代码中添加Optimization 使用类型声明进行优化的常见Lisp最佳实践,optimization,common-lisp,compiler-optimization,Optimization,Common Lisp,Compiler Optimization,我有一个公共Lisp函数,它合并了两个有序的符号列表,没有重复项(两个有序集): 或者,如我所想,如果还需要在我的代码中添加说明符?但是,我应该在哪里以及在什么情况下添加它 有一些规则可以遵循吗 出于优化目的,我是否也应该声明函数的类型?风格 由于您实际上没有以任何有用的方式使用扩展的循环功能,而且循环语法对于您的示例来说也不是很好,因此我建议使用原语循环编写它。请参见COND如何使Lisp程序员更易于阅读: (defun my-merge (x y &aux (first (list
说明符
?但是,我应该在哪里以及在什么情况下添加它
有一些规则可以遵循吗
出于优化目的,我是否也应该声明函数的类型?风格
由于您实际上没有以任何有用的方式使用扩展的循环
功能,而且循环
语法对于您的示例来说也不是很好,因此我建议使用原语循环
编写它。请参见COND
如何使Lisp程序员更易于阅读:
(defun my-merge (x y &aux (first (list nil)) (last first) cx cy)
(macrolet ((cdr! (v)
`(setf ,v (cdr ,v))))
(loop (unless (and x y)
(return))
(setf cx (car x) cy (car y))
(cond ((string= cx cy)
(cdr! x))
((string< cx cy)
(rplacd last (list cx))
(cdr! last)
(cdr! x))
(t
(rplacd last (list cy))
(cdr! last)
(cdr! y))))
(rplacd last (or x y))
(cdr first)))
请注意,了解参数类型可能还不够,可能需要声明结果的类型。因此,的使用就是
<代码>反汇编和分析器是您的朋友
- basic=编译器需要类型声明、优化,但也可以推断某些类型。标准语言的类型是已知的
(foo result-type sequence-1 sequence-2 fn)
- 如果序列是同一类型的,那么可能需要为列表和向量提供一个优化的代码版本
- 如果序列的类型不同,将一个序列转换为不同的类型可能会很有用。也许不是
- 结果类型也有影响,根据结果类型,可能/必要使用不同的算法
fn
是一个接受元素并生成新元素的函数。了解它的类型签名可能会有所帮助——或者不知道
我真的说不出当前哪个通用Lisp具有复杂的序列函数实现。尽管我记得符号学和常见的Lisp实现在这方面做了一些努力
文件和论文
通常,编译器可以优化什么以及如何优化都没有很好的文档记录(如果有的话)。有一些关于这个主题的论文,但它们往往是旧的和/或过时的
- CMUCL的Python编译器:
- CMUCL的Python编译器:
- (附言)
- 快板CL:
- LispWorks:
(defun my-merge (x y &aux (first (list nil)) (last first) cx cy)
(macrolet ((cdr! (v)
`(setf ,v (cdr ,v))))
(loop (unless (and x y)
(return))
(setf cx (car x) cy (car y))
(cond ((string= cx cy)
(cdr! x))
((string< cx cy)
(rplacd last (list cx))
(cdr! last)
(cdr! x))
(t
(rplacd last (list cy))
(cdr! last)
(cdr! y))))
(rplacd last (or x y))
(cdr first)))
(let ((a 1) (b 2))
(declare (integer a b))
(let ((c (the integer (* (the integer (+ a b))
(the integer (- a b))))))
(declare (integer c))
(the integer (* c c))))
(foo result-type sequence-1 sequence-2 fn)