Common Lisp的最佳做法,我有合併兩個符號有序列表一個Common Lisp的功能,無需重複(兩個有序集):使用類型聲明進行優化
(defun my-merge (x y)
"merge two lists of symbols *already sorted and without duplicates*
(and return the resulting list sorted and without duplicates)"
(let* ((first (cons nil nil))
(last first))
(loop while (and x y)
for cx = (car x)
for cy = (car y)
if (string= cx cy)
do (setf x (cdr x))
else if (string< cx cy)
do (rplacd last (cons cx nil))
and do (setf last (cdr last)
x (cdr x))
else do (rplacd last (cons cy nil))
and do (setf last (cdr last)
y (cdr y)))
(rplacd last (or x y))
(cdr first)))
既然我已經發現了大約只有很少的信息爲了有效地編譯代碼的使用實際情況類型聲明的,我不能確定它是否足夠以這種方式聲明變量,例如:
(defun my-merge (x y)
"merge two list of symbols *already sorted and without duplicates*"
(declare (list x y))
(let* ((first (cons nil nil))
(last first))
(declare (cons first last))
(loop while (and x y)
for cx symbol = (car x)
for cy symbol = (car y)
...
,或者因爲我想,如果是還需要添加the
說明符到我的代碼?但那麼,其中和哪些情況下應該加嗎?
有一些規則可以遵循?
我是否還應該爲我的優化目的聲明我的函數的類型?
優化,使用典型值的優化和類型推斷的聲明完全是特定於實現的。你會在實現中找到所有的東西:從基於類型聲明的零優化,使用類型聲明,甚至是*類型推斷*(這意味着需要更少的類型聲明)。通常:聲明類型並進行優化,然後查看生成的彙編程序和/或測量時間。如果你使用SBCL,CMUCL或者LispWorks,編譯器會(或者可以配置爲)告訴你它不能優化的地方以及爲什麼。然後會添加必要的聲明。 –
推出自己的解決方案總是很有趣,但請注意,最好的選擇之一可能就是使用標準[** merge **](http://www.lispworks.com/documentation/HyperSpec/Body/) f_merge.htm)函數。它可以產生任意的序列類型,採用任意的謂詞等,並且實現可能已經優化了它(可能值得查看它們的來源)。 –
@JoshuaTaylor,這是我的第一選擇,但後來我測試了SBCL和CCL的合併函數,它們是我目前使用的實現,並且* both *在大型列表上的性能明顯最差(不記得確切的數字)。我也不知道其中的原因,或者我在執行測試時做了錯誤。 – Renzo