equal
deleted
inserted
replaced
|
1 #lang racket |
|
2 ;; Crude measurement of techniques for patching functions during runtime. |
|
3 ;; |
|
4 ;; 2018-07-17 13:25:34 With Racket v6.90, unboxing is superior to |
|
5 ;; case-lambda; unboxing is only about 5% slower than not being able |
|
6 ;; to update the function at all. |
|
7 |
|
8 (define-namespace-anchor ns-anchor) |
|
9 (define ns (namespace-anchor->namespace ns-anchor)) |
|
10 |
|
11 (define (main) |
|
12 (define N 50000000) |
|
13 |
|
14 (define (by-immutable) |
|
15 (define f (eval '(lambda (x) (+ x 1)) ns)) |
|
16 (for/fold [(x 0)] [(n (in-range N))] (f x))) |
|
17 |
|
18 (for [(i 5)] (time (by-immutable))) |
|
19 (newline) |
|
20 |
|
21 (define (by-unboxing) |
|
22 (define f (eval '(box (lambda (x) (+ x 1))) ns)) |
|
23 (for/fold [(x 0)] [(n (in-range N))] ((unbox f) x))) |
|
24 |
|
25 (for [(i 5)] (time (by-unboxing))) |
|
26 (newline) |
|
27 |
|
28 (define (by-embedding) |
|
29 (define f (eval '(let ((inner-f (lambda (x) (+ x 1)))) |
|
30 (case-lambda |
|
31 [() (lambda (new-f) (set! inner-f new-f))] |
|
32 [(x) (inner-f x)])) |
|
33 ns)) |
|
34 (for/fold [(x 0)] [(n (in-range N))] (f x))) |
|
35 |
|
36 (for [(i 5)] (time (by-embedding))) |
|
37 (newline)) |
|
38 |
|
39 (module+ main (main)) |