ここにコードがあり、想定どおりに機能します。
(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))))
%vector-int-to-c-array 関数は実際には問題ではありませんが、これを実行する必要があります (上記のコードから):
(mem-aref (mem-aref (%vector-int-to-c-array arg) :pointer i) :int n)
100 万回の実行には 0.5 秒かかります。関数を実行すると、 param と「unless」式vector-int
なしで .68 秒かかります。(v (if (< n 5) :float :int))
しかし、上記のように、100 万回の実行に 1.5 秒かかります。ただし、n が 5 未満の場合は :float、n が 5 以上の場合は :int である必要があります。このコードを 100 万回の実行で最大 0.68 秒まで高速化するのを手伝ってくれる人はいますか。唯一の注意点は、cond ステートメントを保持する必要があることです。なぜなら、このコードをここに提示するために削ぎ落としたからです。この部分が加速された後に追加する他の条件があり、vector-int
もう一度実行すると、n を変更して更新された n は自動的に計算されます。