mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-06-12 06:41:13 +02:00
reorder eval clauses
* module/ice-9/eval.scm: Add a comment explaining the frequencies of the various memoized expression types. (eval): Reorder the cases based the profile.
This commit is contained in:
parent
d69531e213
commit
21ec0bd907
1 changed files with 87 additions and 59 deletions
|
@ -188,24 +188,66 @@
|
||||||
(mx-match mx data tag c ...)))))))
|
(mx-match mx data tag c ...)))))))
|
||||||
|
|
||||||
|
|
||||||
|
;;;
|
||||||
|
;;; On 18 Feb 2010, I did a profile of how often the various memoized expression
|
||||||
|
;;; types occur when getting to a prompt on a fresh build. Here are the numbers
|
||||||
|
;;; I got:
|
||||||
|
;;;
|
||||||
|
;;; lexical-ref: 32933054
|
||||||
|
;;; call: 20281547
|
||||||
|
;;; toplevel-ref: 13228724
|
||||||
|
;;; if: 9156156
|
||||||
|
;;; quote: 6610137
|
||||||
|
;;; let: 2619707
|
||||||
|
;;; lambda: 1010921
|
||||||
|
;;; begin: 948945
|
||||||
|
;;; lexical-set: 509862
|
||||||
|
;;; call-with-values: 139668
|
||||||
|
;;; apply: 49402
|
||||||
|
;;; module-ref: 14468
|
||||||
|
;;; define: 1259
|
||||||
|
;;; toplevel-set: 328
|
||||||
|
;;; dynwind: 162
|
||||||
|
;;; with-fluids: 0
|
||||||
|
;;; call/cc: 0
|
||||||
|
;;; module-set: 0
|
||||||
|
;;;
|
||||||
|
;;; So until we compile `case' into a computed goto, we'll order the clauses in
|
||||||
|
;;; `eval' in this order, to put the most frequent cases first.
|
||||||
|
;;;
|
||||||
|
|
||||||
(define primitive-eval
|
(define primitive-eval
|
||||||
(let ()
|
(let ()
|
||||||
;; The "engine". EXP is a memoized expression.
|
;; The "engine". EXP is a memoized expression.
|
||||||
(define (eval exp env)
|
(define (eval exp env)
|
||||||
(memoized-expression-case exp
|
(memoized-expression-case exp
|
||||||
(('begin (first . rest))
|
(('lexical-ref n)
|
||||||
(let lp ((first first) (rest rest))
|
(let lp ((n n) (env env))
|
||||||
(if (null? rest)
|
(if (zero? n)
|
||||||
(eval first env)
|
(car env)
|
||||||
(begin
|
(lp (1- n) (cdr env)))))
|
||||||
(eval first env)
|
|
||||||
(lp (car rest) (cdr rest))))))
|
(('call (f nargs . args))
|
||||||
|
(let ((proc (eval f env)))
|
||||||
|
(call eval proc nargs args env)))
|
||||||
|
|
||||||
|
(('toplevel-ref var-or-sym)
|
||||||
|
(variable-ref
|
||||||
|
(if (variable? var-or-sym)
|
||||||
|
var-or-sym
|
||||||
|
(let lp ((env env))
|
||||||
|
(if (pair? env)
|
||||||
|
(lp (cdr env))
|
||||||
|
(memoize-variable-access! exp (capture-env env)))))))
|
||||||
|
|
||||||
(('if (test consequent . alternate))
|
(('if (test consequent . alternate))
|
||||||
(if (eval test env)
|
(if (eval test env)
|
||||||
(eval consequent env)
|
(eval consequent env)
|
||||||
(eval alternate env)))
|
(eval alternate env)))
|
||||||
|
|
||||||
|
(('quote x)
|
||||||
|
x)
|
||||||
|
|
||||||
(('let (inits . body))
|
(('let (inits . body))
|
||||||
(let lp ((inits inits) (new-env (capture-env env)))
|
(let lp ((inits inits) (new-env (capture-env env)))
|
||||||
(if (null? inits)
|
(if (null? inits)
|
||||||
|
@ -216,36 +258,13 @@
|
||||||
(('lambda (nreq rest? . body))
|
(('lambda (nreq rest? . body))
|
||||||
(make-closure eval nreq rest? body (capture-env env)))
|
(make-closure eval nreq rest? body (capture-env env)))
|
||||||
|
|
||||||
(('quote x)
|
(('begin (first . rest))
|
||||||
x)
|
(let lp ((first first) (rest rest))
|
||||||
|
(if (null? rest)
|
||||||
(('define (name . x))
|
(eval first env)
|
||||||
(define! name (eval x env)))
|
(begin
|
||||||
|
(eval first env)
|
||||||
(('dynwind (in exp . out))
|
(lp (car rest) (cdr rest))))))
|
||||||
(dynamic-wind (eval in env)
|
|
||||||
(lambda () (eval exp env))
|
|
||||||
(eval out env)))
|
|
||||||
|
|
||||||
(('apply (f args))
|
|
||||||
(apply (eval f env) (eval args env)))
|
|
||||||
|
|
||||||
(('call (f nargs . args))
|
|
||||||
(let ((proc (eval f env)))
|
|
||||||
(call eval proc nargs args env)))
|
|
||||||
|
|
||||||
(('call/cc proc)
|
|
||||||
(call/cc (eval proc env)))
|
|
||||||
|
|
||||||
(('call-with-values (producer . consumer))
|
|
||||||
(call-with-values (eval producer env)
|
|
||||||
(eval consumer env)))
|
|
||||||
|
|
||||||
(('lexical-ref n)
|
|
||||||
(let lp ((n n) (env env))
|
|
||||||
(if (zero? n)
|
|
||||||
(car env)
|
|
||||||
(lp (1- n) (cdr env)))))
|
|
||||||
|
|
||||||
(('lexical-set! (n . x))
|
(('lexical-set! (n . x))
|
||||||
(let ((val (eval x env)))
|
(let ((val (eval x env)))
|
||||||
|
@ -254,14 +273,21 @@
|
||||||
(set-car! env val)
|
(set-car! env val)
|
||||||
(lp (1- n) (cdr env))))))
|
(lp (1- n) (cdr env))))))
|
||||||
|
|
||||||
(('toplevel-ref var-or-sym)
|
(('call-with-values (producer . consumer))
|
||||||
|
(call-with-values (eval producer env)
|
||||||
|
(eval consumer env)))
|
||||||
|
|
||||||
|
(('apply (f args))
|
||||||
|
(apply (eval f env) (eval args env)))
|
||||||
|
|
||||||
|
(('module-ref var-or-spec)
|
||||||
(variable-ref
|
(variable-ref
|
||||||
(if (variable? var-or-sym)
|
(if (variable? var-or-spec)
|
||||||
var-or-sym
|
var-or-spec
|
||||||
(let lp ((env env))
|
(memoize-variable-access! exp #f))))
|
||||||
(if (pair? env)
|
|
||||||
(lp (cdr env))
|
(('define (name . x))
|
||||||
(memoize-variable-access! exp (capture-env env)))))))
|
(define! name (eval x env)))
|
||||||
|
|
||||||
(('toplevel-set! (var-or-sym . x))
|
(('toplevel-set! (var-or-sym . x))
|
||||||
(variable-set!
|
(variable-set!
|
||||||
|
@ -273,11 +299,13 @@
|
||||||
(memoize-variable-access! exp (capture-env env)))))
|
(memoize-variable-access! exp (capture-env env)))))
|
||||||
(eval x env)))
|
(eval x env)))
|
||||||
|
|
||||||
(('module-ref var-or-spec)
|
(('dynwind (in exp . out))
|
||||||
(variable-ref
|
(dynamic-wind (eval in env)
|
||||||
(if (variable? var-or-spec)
|
(lambda () (eval exp env))
|
||||||
var-or-spec
|
(eval out env)))
|
||||||
(memoize-variable-access! exp #f))))
|
|
||||||
|
(('call/cc proc)
|
||||||
|
(call/cc (eval proc env)))
|
||||||
|
|
||||||
(('module-set! (x . var-or-spec))
|
(('module-set! (x . var-or-spec))
|
||||||
(variable-set!
|
(variable-set!
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue