cs: reduce allocation on linklet instantiation

Avoid some closure creations and `append`s. The performance
improvement is very small, but measurable.
This commit is contained in:
Matthew Flatt 2019-04-24 11:02:44 -06:00
parent d69f5cf00f
commit 42009925dc

View File

@ -701,13 +701,12 @@
(linklet-code linklet) (linklet-code linklet)
(eval-from-bytevector (linklet-code linklet) (linklet-paths linklet) (linklet-format linklet))) (eval-from-bytevector (linklet-code linklet) (linklet-paths linklet) (linklet-format linklet)))
(make-variable-reference target-instance #f) (make-variable-reference target-instance #f)
(append (apply append (extract-imported-variabless target-instance
(map (make-extract-variables target-instance) import-instances
import-instances (linklet-importss linklet)
(linklet-importss linklet) (linklet-importss-abi linklet)
(linklet-importss-abi linklet))) (create-variables target-instance
(create-variables target-instance (linklet-exports linklet)))))))))]
(linklet-exports linklet)))))))))]
[else [else
;; Make a fresh instance, recur, and return the instance ;; Make a fresh instance, recur, and return the instance
(let ([i (make-instance (linklet-name linklet))]) (let ([i (make-instance (linklet-name linklet))])
@ -786,19 +785,28 @@
;; Find variables or values needed from an instance for a linklet's ;; Find variables or values needed from an instance for a linklet's
;; imports ;; imports
(define (make-extract-variables target-inst) (define (extract-imported-variabless target-inst insts symss imports-abis accum)
(lambda (inst syms imports-abi) (cond
(let ([ht (instance-hash inst)]) [(null? insts) accum]
(map (lambda (sym import-abi) [else (extract-imported-variables
(let ([var (or (hash-ref ht sym #f) target-inst (car insts) (car symss) (car imports-abis)
(raise-linking-failure "is not exported" target-inst inst sym))]) (extract-imported-variabless target-inst (cdr insts) (cdr symss) (cdr imports-abis)
(when (eq? (variable-val var) variable-undefined) accum))]))
(raise-linking-failure "is uninitialized" target-inst inst sym)) (define (extract-imported-variables target-inst inst syms imports-abi accum)
(if import-abi (cond
(variable-val var) [(null? syms) accum]
var))) [else
syms (let ([sym (car syms)]
imports-abi)))) [import-abi (car imports-abi)])
(let ([var (or (hash-ref (instance-hash inst) sym #f)
(raise-linking-failure "is not exported" target-inst inst sym))])
(when (eq? (variable-val var) variable-undefined)
(raise-linking-failure "is uninitialized" target-inst inst sym))
(let ([v (if import-abi
(variable-val var)
var)])
(cons v
(extract-imported-variables target-inst inst (cdr syms) (cdr imports-abi) accum)))))]))
(define (raise-linking-failure why target-inst inst sym) (define (raise-linking-failure why target-inst inst sym)
(raise-arguments-error 'instantiate-linklet (raise-arguments-error 'instantiate-linklet