common lisp - defclass type information for performance -
in following program, removing line
(declare (type (simple-array bit) arr)) makes running time increase more factor of 3, using sbcl. type information given in defclass macro via :type on other hand appears have no impact on performance.
(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 1 10000 (sample inst))) how can have same performance benefit without having declare arr slot simple-array bit each time use it? latter particularly annoying since (as far have found out) requires introduce binding via let or similar each time; cannot write (slot-value inst 'arr) in place need it.
first of all, sbcl-specific question, might better answer on sbcl user list. different compilers different optimizations, , ignore @ least declarations.
second, should let-bind arr because using twice.
third, can use the if want avoid let-bind:
(the (simple-array bit) (slot-value inst 'arr)) fourth, if want compiler infer type, use specific reader instead of slot-value:
(defclass c () ((arr :type (simple-array bit) :reader c-arr))) (defun sample (inst) (declare (type class-1 inst)) (let ((arr (c-arr inst))) (map-into arr #'(lambda (dummy) (random 2)) arr))) c-arr should allow compiler infer value type easier, (as have discovered yourself!) might need declare return type:
(declaim (ftype (function (c) (simple-array bit)) c-arr)) the reason is, apparently, sbcl ignores slot type declarations.
Comments
Post a Comment