Common lisp 如何加速这个常见的Lisp/CFFI代码,一个封装在let中的defun
这是代码,它的工作原理是:Common lisp 如何加速这个常见的Lisp/CFFI代码,一个封装在let中的defun,common-lisp,cffi,Common Lisp,Cffi,这是代码,它的工作原理是: (let ((previous nil)) (defun vector-int (&optional arg i n (v (if (< n 5) :float :int))) (cond ((and (pointerp arg) i n) (unless (equal v (car previous)) (setf previous (cons v (v (if (&
(let ((previous nil))
(defun vector-int (&optional arg i n (v (if (< n 5) :float :int)))
(cond ((and (pointerp arg) i n)
(unless (equal v (car previous))
(setf previous (cons v (v (if (< n 5) :float :int))))
(mem-aref (mem-aref (%vector-int-to-c-array arg) :pointer i) (cdr previous) n))
(t nil))))
100万次跑步需要0.5秒。如果我运行vector int
函数,则在没有(v(If( 但如上所述,100万次跑步需要1.5秒。如果n小于5,则需要n为:float;如果n等于或大于5,则需要n为:int。谁能帮我把这段代码的速度提高到不超过0.68秒,运行100万次。唯一需要注意的是我需要保留cond语句。因为我把这个代码缩减到这里,在这部分加速后我还有其他条件要添加,当我再次运行向量int
时,我必须能够更改n并自动计算更新的n。是(cons v(v)(if(
在setf
表单中应该是(cons v previous)
?我不知道previous
的结构是什么。@jbm感谢您加入我的帖子。.v应该设置为(if(
这是函数将运行的值,我只需要n为:int,如果输入为4或更小,并且:float在上面…int或:float不是由用户定义的,而是由n的值派生的,但是…cffi:mem aref似乎要求我这样做…似乎我正在取消引用的指针包含:int和:float数字只能向mem aref输出一个或另一个…因此我必须找到解决方法,您可以尝试用(equal v(car previous))
替换(eq v(car previous))
。在SBCL中进行快速测试时,使用eq
将该测试的CPU周期缩短25%-40%。然而,两者都是如此之快,无论哪种方式都可能不会产生实际的影响。我在你的代码上简单地尝试了一下,似乎没有什么不同,但对你的实现、平台等来说效果可能会有所不同。@jbm感谢你提供的简洁信息…你能告诉我如何在优化链接运行时生成代码吗…尝试测试,但出现错误
(mem-aref (mem-aref (%vector-int-to-c-array arg) :pointer i) :int n)