;;;; bench.scm (use fast-generic data-structures) (define-type number number?) (define *n* 0) (define (bump n) (set! *n* (+ n *n*))) (define (function x y z) (bump 1) (noop x y z)) (define-generic (generic-function x y z) (bump 1) (noop x y z)) (define-generic (generic-function (number x) y z) (bump 2) (noop x y z)) (define *count* (string->number (optional (command-line-arguments) "10000000"))) (define (times name n proc) (set! *n* 0) (print* name " ... ") (time (do ((i n (sub1 i))) ((zero? i)) (proc)))) ;;; (define *arg* 'x) (times "function" *count* (cut function *arg* 2 3)) (assert (= *n* *count*)) (times "generic #1 (not inlined)" *count* (cut generic-function *arg* 2 3)) (assert (= *n* *count*)) (set! *arg* 99) (times "generic #2 (not inlined)" *count* (cut generic-function *arg* 2 3)) (assert (= *n* (* 2 *count*))) (set! *arg* 'x) (times "generic #1 (inlined)" *count* (lambda () (generic-function *arg* 2 3))) (assert (= *n* *count*)) (set! *arg* 99) (times "generic #2 (inlined)" *count* (lambda () (generic-function *arg* 2 3))) (assert (= *n* (* 2 *count*)))