Trong chương trình sau đây, loại bỏ dòngdefclass loại thông tin để thực hiện
(declare (type (simple-array bit) arr))
làm cho thời gian chạy tăng hơn gấp 3, sử dụng SBCL. Thông tin loại được cung cấp trong macro defclass
qua :type
có vẻ không ảnh hưởng đến hiệu suất.
(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)))
Làm thế nào tôi có thể có hiệu quả lợi ích tương tự mà không cần phải khai báo arr
khe một simple-array bit
mỗi khi tôi sử dụng nó? Cái sau đặc biệt khó chịu vì (theo như tôi đã tìm ra) được yêu cầu giới thiệu một ràng buộc qua let
hoặc tương tự mỗi lần; Tôi không thể chỉ viết (slot-value inst 'arr)
ở nơi tôi cần.
Sử dụng trình đọc là một ý tưởng hay nhưng nó không hiệu quả với tôi. Tuy nhiên, những gì làm việc là một đầu đọc cộng với những điều sau đây, sử dụng tên lớp và hàm của bạn: '(declaim (ftype (function ((c)) (bit mảng đơn giản)) c-arr))'. Với điều này tại chỗ, ngay cả ': type' có thể được bỏ qua, cũng như' (khai báo (loại lớp-1 inst)) '. –
Nó có lẽ nên là '(declaim (ftype (hàm (c) (bit mảng đơn giản)) c-arr))'. Cả hai dường như làm việc, tôi không chắc chắn tại sao. Đã không sử dụng hình thức đó trước đây. –