निम्नलिखित कार्यक्रम में, लाइनdefclass प्रकार की जानकारी
(declare (type (simple-array bit) arr))
को हटाने के 3 के एक से अधिक कारक द्वारा समय वृद्धि चल रहा है, SBCL का उपयोग कर बनाता है। दूसरी ओर :type
के माध्यम से defclass
मैक्रो में दी गई प्रकार की जानकारी प्रदर्शन पर कोई प्रभाव नहीं पड़ती है।
(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)
लिख नहीं सकता जहां मुझे इसकी आवश्यकता है।
एक पाठक का उपयोग करना एक अच्छा विचार था, लेकिन यह मेरे लिए सीधे काम नहीं करता था। हालांकि, आपके वर्ग और फ़ंक्शन नामों का उपयोग करके, एक पाठक प्लस निम्नलिखित है: '(अस्वीकरण (ftype (फ़ंक्शन ((सी)) (सरल-सरणी बिट)) सी-एआर))'। इस जगह के साथ, यहां तक कि ': type' को छोड़ा जा सकता है, साथ ही' (घोषित करें (टाइप क्लास -1 इंस्ट)) '। –
यह शायद 'होना चाहिए (अस्वीकरण (ftype (फ़ंक्शन (सी) (सरल-सरणी बिट)) सी-एआर))'। दोनों काम पर दिखाई देते हैं, मुझे यकीन नहीं है कि क्यों। पहले उस फॉर्म का उपयोग नहीं किया है। –