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)