在下面的程序,除去線性能defclass類型信息
(declare (type (simple-array bit) arr))
使得由多於一個因素的運行時間3增加,使用SBCL。 defclass
宏中通過:type
提供的類型信息似乎對性能沒有影響。
(defclass class-1() ((arr :type (simple-array bit))))
(defun sample (inst)
(declare (type class-1 inst))
(let ((arr (slot-value inst 'arr)))
(declare (type (simple-array bit) arr)) ;; 3x running time without
(map-into arr #'(lambda (dummy) (if (< (random 1.0) 0.5) 0 1)) arr)))
(let ((inst (make-instance 'class-1)))
(setf (slot-value inst 'arr) (make-array 10000 :element-type 'bit))
(loop for i from 1 to 10000 do (sample inst)))
怎樣纔可以有無需聲明每次使用它的時候了arr
插槽simple-array bit
相同的性能優勢?後者特別煩人,因爲(據我所知)需要每次都通過let
或類似的方式引入綁定;我不能只在需要它的地方寫(slot-value inst 'arr)
。
使用讀卡器是一個好主意,但它不直接爲我工作。然而,使用你的類和函數名的是一個讀者加上以下內容:'(declaim(ftype(function((c))(simple-array bit))c-arr))'。有了這個,甚至可以省略':type',以及'(declare(type class-1 inst))'。 –
它可能應該是'(declaim(ftype(function(c)(simple-array bit))c-arr))'。兩者都似乎工作,我不知道爲什麼。以前沒有使用過這種形式。 –