Do not use vector-set when creating record types

This improves performance as mutations force the GC to do more work.
This commit is contained in:
Justin Ethier 2019-02-27 10:29:18 -05:00
parent f5b68ee8d2
commit 0f0beb024c

View file

@ -1818,11 +1818,13 @@
;; Record-type definitions ;; Record-type definitions
(define record-marker (list 'record-marker)) (define record-marker (list 'record-marker))
(define (register-simple-type name parent field-tags) (define (register-simple-type name parent field-tags)
(let ((new (make-vector 3 #f))) (vector record-marker name field-tags)
(vector-set! new 0 record-marker) ;(let ((new (make-vector 3 #f)))
(vector-set! new 1 name) ; (vector-set! new 0 record-marker)
(vector-set! new 2 field-tags) ; (vector-set! new 1 name)
new)) ; (vector-set! new 2 field-tags)
; new)
)
(define (make-type-predicate pred name) (define (make-type-predicate pred name)
(lambda (obj) (lambda (obj)
(and (vector? obj) (and (vector? obj)
@ -1832,12 +1834,15 @@
(lambda () (lambda ()
(let* ((field-tags (vector-ref name 2)) (let* ((field-tags (vector-ref name 2))
(field-values (make-vector (length field-tags) #f)) (field-values (make-vector (length field-tags) #f))
(new (make-vector 3 #f)) ; (new (make-vector 3 #f))
) )
(vector-set! new 0 record-marker) ; (vector-set! new 0 record-marker)
(vector-set! new 1 name) ; (vector-set! new 1 name)
(vector-set! new 2 field-values) ; (vector-set! new 2 field-values)
new))) ; new
(vector record-marker name field-values)
)
));
(define (type-slot-offset name sym) (define (type-slot-offset name sym)
(let ((field-tags (vector-ref name 2))) (let ((field-tags (vector-ref name 2)))
(_list-index sym field-tags))) (_list-index sym field-tags)))