Nel seguente programma, rimuovendo la rigadefclass informazioni tipo per prestazioni
(declare (type (simple-array bit) arr))
rende esecuzione aumentare il tempo di più di un fattore 3, utilizzando SBCL. Le informazioni sul tipo fornite nella macro defclass
tramite :type
non sembrano avere alcun impatto sulle prestazioni.
(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)))
Come posso avere lo stesso beneficio delle prestazioni, senza dover dichiarare il arr
slot di un simple-array bit
ogni volta che lo uso? Quest'ultimo è particolarmente fastidioso dal momento che (per quanto ho scoperto) è necessario introdurre un binding tramite let
o simili ogni volta; Non posso semplicemente scrivere (slot-value inst 'arr)
nel posto in cui ho bisogno.
L'utilizzo di un lettore era una buona idea, ma non ha funzionato direttamente per me. Ciò che ha funzionato, tuttavia, è un lettore più il seguente, usando i nomi delle classi e delle funzioni: '(declaim (ftype (function ((c)) (simple-array bit)) c-arr))'. Con questo posto, anche il ': tipo' può essere omesso, così come' (declare (tipo class-1 inst)) '. –
Probabilmente dovrebbe essere '(declaim (ftype (function (c) (simple-array bit)) c-arr))'. Entrambi sembrano funzionare, non sono sicuro del perché. Non ho usato quella forma prima. –