-
Notifications
You must be signed in to change notification settings - Fork 0
/
treebench.ss
109 lines (99 loc) · 3.25 KB
/
treebench.ss
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
;; Chez Scheme version
(define (build-tree n)
(define (go root n)
(if (zero? n)
root
(cons (go root (sub1 n))
(go (+ root (expt 2 (sub1 n)))
(sub1 n)))))
(go 1 n))
(define (build-tree2 n)
(define (go root n)
(if (zero? n)
root
(cons (go root (sub1 n))
(go root (sub1 n)))))
(go 1 n))
(define (add1-tree tr)
(if (pair? tr)
(cons (add1-tree (car tr))
(add1-tree (cdr tr)))
(#3%fx+ 1 tr)))
(define (sum-tree tr)
(if (pair? tr)
(+ (sum-tree (car tr))
(sum-tree (cdr tr)))
tr))
(define (bench tr n)
(collect-maximum-generation)
(time (add1-tree tr)))
(define-values (mode size iters)
(cond
[(= (length (command-line-arguments)) 3)
(values (car (command-line-arguments))
(string->number (cadr (command-line-arguments)))
(string->number (caddr (command-line-arguments))))]
[else (error 'treebench (format "expected three command line args, <mode> <depth> <iters>, got ~a: ~a"
(length (command-line-arguments))
(command-line-arguments)))]))
(printf "Benchmarking on tree of size 2^~a, ~a iterations\n" size iters)
(cond
[(equal? "build" mode)
(printf "Benchmarking build\n")
(time
(let* ([start-time (current-time 'time-duration)]
[st-ns (+ (* (expt 10 9) (time-second start-time))
(time-nanosecond start-time))])
(time (let loop ([i 0])
(build-tree2 size)
(when (< i iters)
(loop (add1 i)))))
(let* ([end-time (current-time 'time-duration)]
[et-ns (+ (* (expt 10 9) (time-second end-time))
(time-nanosecond end-time))]
[diff (- et-ns st-ns)]
[batchseconds (/ diff 1000000000.0)]) ;; make sure to print out a real number.
(printf "Time ~a\n" batchseconds)
(printf "BATCHTIME: ~a\n" batchseconds)
)))
]
[(equal? "sum" mode)
(printf "Benchmarking sum\n")
(time
(let ([tr (build-tree size)])
(let* ([start-time (current-time 'time-duration)]
[st-ns (+ (* (expt 10 9) (time-second start-time))
(time-nanosecond start-time))])
(time (let loop ([i 0])
(sum-tree tr)
(when (< i iters)
(loop (add1 i)))))
(let* ([end-time (current-time 'time-duration)]
[et-ns (+ (* (expt 10 9) (time-second end-time))
(time-nanosecond end-time))]
[diff (- et-ns st-ns)]
[batchseconds (/ diff 1000000000.0)]) ;; make sure to print out a real number.
(printf "Time ~a\n" batchseconds)
(printf "BATCHTIME: ~a\n" batchseconds)
))))
]
[else
(printf "Benchmarking add1\n")
(time
(let ([tr (build-tree size)])
(let* ([start-time (current-time 'time-duration)]
[st-ns (+ (* (expt 10 9) (time-second start-time))
(time-nanosecond start-time))])
(time (let loop ([i 0])
(add1-tree tr)
(when (< i iters)
(loop (add1 i)))))
(let* ([end-time (current-time 'time-duration)]
[et-ns (+ (* (expt 10 9) (time-second end-time))
(time-nanosecond end-time))]
[diff (- et-ns st-ns)]
[batchseconds (/ diff 1000000000.0)]) ;; make sure to print out a real number.
(printf "Time ~a\n" batchseconds)
(printf "BATCHTIME: ~a\n" batchseconds)
))))
])