author | Tony Garnock-Jones <tonygarnockjones@gmail.com> |
Wed, 16 Jan 2019 17:15:58 +0000 | |
changeset 438 | 1fe179d53161 |
parent 427 | 2971b9971cf0 |
permissions | -rw-r--r-- |
399
867c5642429c
tinyBenchmarks benchFib in Racket
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
1 |
#lang racket |
867c5642429c
tinyBenchmarks benchFib in Racket
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
2 |
;; Sends-per-second benchmarking. 0 tinyBenchmarks computes "sends per |
867c5642429c
tinyBenchmarks benchFib in Racket
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
3 |
;; second" by taking the result of a call to benchFib and dividing it |
867c5642429c
tinyBenchmarks benchFib in Racket
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
4 |
;; by the time it took. So for (benchfib 28), yielding 1028457, if it |
867c5642429c
tinyBenchmarks benchFib in Racket
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
5 |
;; took 0.5 seconds, you'd have "sends/sec" of 2056914. |
867c5642429c
tinyBenchmarks benchFib in Racket
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
6 |
|
867c5642429c
tinyBenchmarks benchFib in Racket
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
7 |
(module+ test (require rackunit)) |
867c5642429c
tinyBenchmarks benchFib in Racket
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
8 |
|
867c5642429c
tinyBenchmarks benchFib in Racket
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
9 |
(define (benchfib n) |
867c5642429c
tinyBenchmarks benchFib in Racket
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
10 |
(if (< n 2) |
867c5642429c
tinyBenchmarks benchFib in Racket
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
11 |
1 |
867c5642429c
tinyBenchmarks benchFib in Racket
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
12 |
(+ (benchfib (- n 1)) |
867c5642429c
tinyBenchmarks benchFib in Racket
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
13 |
(benchfib (- n 2)) |
867c5642429c
tinyBenchmarks benchFib in Racket
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
14 |
1))) |
867c5642429c
tinyBenchmarks benchFib in Racket
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
15 |
|
867c5642429c
tinyBenchmarks benchFib in Racket
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
16 |
(module+ test |
867c5642429c
tinyBenchmarks benchFib in Racket
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
17 |
(check-equal? (benchfib 1) 1) |
867c5642429c
tinyBenchmarks benchFib in Racket
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
18 |
(check-equal? (benchfib 10) 177)) |
867c5642429c
tinyBenchmarks benchFib in Racket
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
19 |
|
867c5642429c
tinyBenchmarks benchFib in Racket
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
20 |
(define f< <) |
867c5642429c
tinyBenchmarks benchFib in Racket
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
21 |
(define f+ +) |
867c5642429c
tinyBenchmarks benchFib in Racket
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
22 |
(define f- -) |
867c5642429c
tinyBenchmarks benchFib in Racket
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
23 |
|
400
eb37f3307eeb
Experiment with using parameters to record continuations (as expected, it's slow)
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
399
diff
changeset
|
24 |
(define kont (make-parameter '())) |
eb37f3307eeb
Experiment with using parameters to record continuations (as expected, it's slow)
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
399
diff
changeset
|
25 |
|
eb37f3307eeb
Experiment with using parameters to record continuations (as expected, it's slow)
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
399
diff
changeset
|
26 |
(define-syntax-rule (with-k x b) |
eb37f3307eeb
Experiment with using parameters to record continuations (as expected, it's slow)
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
399
diff
changeset
|
27 |
(parameterize ((kont (cons x (kont)))) b)) |
eb37f3307eeb
Experiment with using parameters to record continuations (as expected, it's slow)
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
399
diff
changeset
|
28 |
|
399
867c5642429c
tinyBenchmarks benchFib in Racket
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
29 |
(define int% |
867c5642429c
tinyBenchmarks benchFib in Racket
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
30 |
(class object% |
400
eb37f3307eeb
Experiment with using parameters to record continuations (as expected, it's slow)
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
399
diff
changeset
|
31 |
(define/public (benchfib/k n) |
eb37f3307eeb
Experiment with using parameters to record continuations (as expected, it's slow)
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
399
diff
changeset
|
32 |
(if (with-k 'if (< n 2)) |
eb37f3307eeb
Experiment with using parameters to record continuations (as expected, it's slow)
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
399
diff
changeset
|
33 |
1 |
eb37f3307eeb
Experiment with using parameters to record continuations (as expected, it's slow)
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
399
diff
changeset
|
34 |
(+ (with-k 'b1 (send this benchfib/k (with-k '-1 (- n 1)))) |
eb37f3307eeb
Experiment with using parameters to record continuations (as expected, it's slow)
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
399
diff
changeset
|
35 |
(with-k 'add (+ (with-k 'b2 (send this benchfib/k (with-k '-2 (- n 2)))) |
eb37f3307eeb
Experiment with using parameters to record continuations (as expected, it's slow)
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
399
diff
changeset
|
36 |
1))))) |
eb37f3307eeb
Experiment with using parameters to record continuations (as expected, it's slow)
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
399
diff
changeset
|
37 |
|
399
867c5642429c
tinyBenchmarks benchFib in Racket
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
38 |
(define/public (benchfib* n k) |
867c5642429c
tinyBenchmarks benchFib in Racket
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
39 |
(send this <* n 2 |
867c5642429c
tinyBenchmarks benchFib in Racket
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
40 |
(lambda (is-lt-2) |
867c5642429c
tinyBenchmarks benchFib in Racket
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
41 |
(if is-lt-2 |
867c5642429c
tinyBenchmarks benchFib in Racket
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
42 |
(k 1) |
867c5642429c
tinyBenchmarks benchFib in Racket
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
43 |
(send this -* n 1 |
867c5642429c
tinyBenchmarks benchFib in Racket
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
44 |
(lambda (n1) |
867c5642429c
tinyBenchmarks benchFib in Racket
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
45 |
(send this benchfib* n1 |
867c5642429c
tinyBenchmarks benchFib in Racket
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
46 |
(lambda (v1) |
867c5642429c
tinyBenchmarks benchFib in Racket
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
47 |
(send this -* n 2 |
867c5642429c
tinyBenchmarks benchFib in Racket
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
48 |
(lambda (n2) |
867c5642429c
tinyBenchmarks benchFib in Racket
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
49 |
(send this benchfib* n2 |
867c5642429c
tinyBenchmarks benchFib in Racket
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
50 |
(lambda (v2) |
867c5642429c
tinyBenchmarks benchFib in Racket
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
51 |
(send this +* v1 v2 |
867c5642429c
tinyBenchmarks benchFib in Racket
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
52 |
(lambda (v3) |
867c5642429c
tinyBenchmarks benchFib in Racket
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
53 |
(send this +* v3 1 k))))))))))))))) |
867c5642429c
tinyBenchmarks benchFib in Racket
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
54 |
|
867c5642429c
tinyBenchmarks benchFib in Racket
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
55 |
(define/public (benchfib n) |
867c5642429c
tinyBenchmarks benchFib in Racket
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
56 |
(if (send this < n 2) |
867c5642429c
tinyBenchmarks benchFib in Racket
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
57 |
1 |
867c5642429c
tinyBenchmarks benchFib in Racket
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
58 |
(send this + |
867c5642429c
tinyBenchmarks benchFib in Racket
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
59 |
(send this benchfib (send this - n 1)) |
867c5642429c
tinyBenchmarks benchFib in Racket
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
60 |
(send this + |
867c5642429c
tinyBenchmarks benchFib in Racket
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
61 |
(send this benchfib (send this - n 2)) |
867c5642429c
tinyBenchmarks benchFib in Racket
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
62 |
1)))) |
867c5642429c
tinyBenchmarks benchFib in Racket
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
63 |
|
867c5642429c
tinyBenchmarks benchFib in Racket
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
64 |
(define/public (benchfib** n) |
867c5642429c
tinyBenchmarks benchFib in Racket
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
65 |
(if (f< n 2) |
867c5642429c
tinyBenchmarks benchFib in Racket
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
66 |
1 |
867c5642429c
tinyBenchmarks benchFib in Racket
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
67 |
(f+ (send this benchfib** (f- n 1)) |
867c5642429c
tinyBenchmarks benchFib in Racket
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
68 |
(send this benchfib** (f- n 2)) |
867c5642429c
tinyBenchmarks benchFib in Racket
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
69 |
1))) |
867c5642429c
tinyBenchmarks benchFib in Racket
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
70 |
|
867c5642429c
tinyBenchmarks benchFib in Racket
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
71 |
(define/public (<* a b k) (k (< a b))) |
867c5642429c
tinyBenchmarks benchFib in Racket
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
72 |
(define/public (+* a b k) (k (+ a b))) |
867c5642429c
tinyBenchmarks benchFib in Racket
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
73 |
(define/public (-* a b k) (k (- a b))) |
867c5642429c
tinyBenchmarks benchFib in Racket
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
74 |
|
867c5642429c
tinyBenchmarks benchFib in Racket
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
75 |
(define/public (< a b) (f< a b)) |
867c5642429c
tinyBenchmarks benchFib in Racket
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
76 |
(define/public (+ a b) (f+ a b)) |
867c5642429c
tinyBenchmarks benchFib in Racket
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
77 |
(define/public (- a b) (f- a b)) |
867c5642429c
tinyBenchmarks benchFib in Racket
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
78 |
|
867c5642429c
tinyBenchmarks benchFib in Racket
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
79 |
(super-new))) |
867c5642429c
tinyBenchmarks benchFib in Racket
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
80 |
|
867c5642429c
tinyBenchmarks benchFib in Racket
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
81 |
(module+ test |
867c5642429c
tinyBenchmarks benchFib in Racket
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
82 |
(check-equal? (send (make-object int%) benchfib 1) 1) |
867c5642429c
tinyBenchmarks benchFib in Racket
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
83 |
(check-equal? (send (make-object int%) benchfib 10) 177) |
867c5642429c
tinyBenchmarks benchFib in Racket
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
84 |
(check-equal? (send (make-object int%) benchfib* 10 values) 177) |
400
eb37f3307eeb
Experiment with using parameters to record continuations (as expected, it's slow)
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
399
diff
changeset
|
85 |
(check-equal? (send (make-object int%) benchfib** 10) 177) |
eb37f3307eeb
Experiment with using parameters to record continuations (as expected, it's slow)
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
399
diff
changeset
|
86 |
(check-equal? (send (make-object int%) benchfib/k 10) 177)) |
399
867c5642429c
tinyBenchmarks benchFib in Racket
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
diff
changeset
|
87 |
|
427
2971b9971cf0
Better tinybenchmarks.rkt printing
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
400
diff
changeset
|
88 |
(define-syntax-rule (time-benchfib expr) |
2971b9971cf0
Better tinybenchmarks.rkt printing
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
400
diff
changeset
|
89 |
(let-values (((results cpu-ms wall-ms gc-ms) (time-apply (lambda () expr) '()))) |
2971b9971cf0
Better tinybenchmarks.rkt printing
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
400
diff
changeset
|
90 |
(match-define (list result) results) |
2971b9971cf0
Better tinybenchmarks.rkt printing
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
400
diff
changeset
|
91 |
(printf "~a returned ~a in ~a CPU-ms (~a without GC time) -> ~a sends/sec\n" |
2971b9971cf0
Better tinybenchmarks.rkt printing
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
400
diff
changeset
|
92 |
'expr |
2971b9971cf0
Better tinybenchmarks.rkt printing
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
400
diff
changeset
|
93 |
result |
2971b9971cf0
Better tinybenchmarks.rkt printing
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
400
diff
changeset
|
94 |
cpu-ms |
2971b9971cf0
Better tinybenchmarks.rkt printing
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
400
diff
changeset
|
95 |
(- cpu-ms gc-ms) |
2971b9971cf0
Better tinybenchmarks.rkt printing
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
400
diff
changeset
|
96 |
(/ result (/ cpu-ms 1000.0))) |
2971b9971cf0
Better tinybenchmarks.rkt printing
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
400
diff
changeset
|
97 |
(flush-output))) |
2971b9971cf0
Better tinybenchmarks.rkt printing
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
400
diff
changeset
|
98 |
|
2971b9971cf0
Better tinybenchmarks.rkt printing
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
400
diff
changeset
|
99 |
(time-benchfib (benchfib 28)) |
2971b9971cf0
Better tinybenchmarks.rkt printing
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
400
diff
changeset
|
100 |
(time-benchfib (send (make-object int%) benchfib 28)) |
2971b9971cf0
Better tinybenchmarks.rkt printing
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
400
diff
changeset
|
101 |
(time-benchfib (send (make-object int%) benchfib* 28 values)) |
2971b9971cf0
Better tinybenchmarks.rkt printing
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
400
diff
changeset
|
102 |
(time-benchfib (send (make-object int%) benchfib** 28)) |
2971b9971cf0
Better tinybenchmarks.rkt printing
Tony Garnock-Jones <tonygarnockjones@gmail.com>
parents:
400
diff
changeset
|
103 |
(time-benchfib (send (make-object int%) benchfib/k 28)) |