blob: 9d77bfa4e0ea3ee172835cf0311832856b43aca1 (
plain)
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
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
|
;;;; "bench.scm", Scheme benchmarks: digits of pi and random statistics.
;; Copyright (C) 1996, 1997, 2001, 2002 Free Software Foundation, Inc.
;;
;; This program is free software: you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as
;; published by the Free Software Foundation, either version 3 of the
;; License, or (at your option) any later version.
;;
;; This program is distributed in the hope that it will be useful, but
;; WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
;; General Public License for more details.
;;
;; You should have received a copy of the GNU General Public
;; License along with this program. If not, see
;; <http://www.gnu.org/licenses/>.
;;; Author: Aubrey Jaffer.
(require 'transcript)
(require-if 'inexact 'root)
(require-if 'inexact 'printf)
(require 'random)
(require 'array)
;;(load (in-vicinity (implementation-vicinity) "prng-v.scm"))
(load (in-vicinity (implementation-vicinity) "pi.scm"))
(define isqrt
(cond ((provided? 'inexact) sqrt)
(else (require 'root) integer-sqrt)))
(define i/
(cond ((provided? 'inexact) /)
(else quotient)))
(define around
(cond ((provided? 'inexact)
(let ()
(require 'printf)
(lambda (x prec) (sprintf #f "%.*g" prec x))))
(else (lambda (x prec) x))))
(define (time-call proc . args)
(let ((start-time (get-internal-run-time)))
(apply proc args)
(i/ (* 1000 (- (get-internal-run-time) start-time))
internal-time-units-per-second)))
(define (benchmark-pi . arg)
(define file (if (null? arg) "pi.log" (car arg)))
(do ((digits 50 (+ digits digits))
(t 0 (time-call pi (+ digits digits) 4)))
((> t 3600)
(do ((tl '() (cons (time-call pi digits 4) tl))
(j 12 (+ -1 j)))
((zero? j)
(let* ((avg (i/ (apply + tl) (length tl)))
(dev (isqrt (i/ (apply
+ (map (lambda (x) (* (- x avg) (- x avg)))
tl))
(length tl)))))
(and file (transcript-on file))
(for-each display
(list digits " digits of pi took " (around avg 4) ".ms"
" +/- " (around dev 2) ".ms"))
(newline)
(let ((scaled-avg (i/ (* (i/ (* avg 1000) digits) 1000) digits))
(scaled-dev (i/ (* (i/ (* dev 1000) digits) 1000) digits)))
(for-each display
(list " That is about "
(around scaled-avg 4) ".ms/(kB)^2"
" +/- "
(around scaled-dev 2) ".ms/(kB)^2"))
(newline)
(and file (transcript-off)))
))))))
(define (prng samples modu sta)
(define sra (make-array (A:fixN32b) samples))
(do ((cnt (+ -1 samples) (+ -1 cnt))
(num (random modu sta) (random modu sta))
(sum 0 (+ sum num)))
((negative? cnt)
(set! sum (+ sum num))
(let ((mean (i/ sum samples)))
(define (square-diff x) (define z (- x mean)) (* z z))
(do ((cnt (+ -1 samples) (+ -1 cnt))
(var2 0 (+ (square-diff (array-ref sra cnt)) var2)))
((negative? cnt)
(for-each display
(list sum " / " samples " = "
mean " +/- " (isqrt (i/ var2 samples))))
(newline)))))
(array-set! sra num cnt)))
(define (benchmark-prng . arg)
(define file (if (null? arg) "prng.log" (car arg)))
(define sta
(seed->random-state "http://swissnet.ai.mit.edu/~jaffer/SLIB.html"))
(do ((samples 125 (* 4 samples))
(t 0 (time-call prng (* 2 samples) 999 sta)))
((or (> t 1000) (and (not (provided? 'bignum)) (> samples 1000)))
(do ((tl '() (cons (time-call prng samples 999 sta) tl))
(j 12 (+ -1 j)))
((zero? j)
(let* ((avg (i/ (apply + tl) (length tl)))
(dev (isqrt (i/ (apply
+ (map (lambda (x) (* (- x avg) (- x avg)))
tl))
(length tl)))))
(and file (transcript-on file))
(for-each display
(list samples " random samples took " (around avg 4) ".ms"
" +/- " (around dev 2) ".ms"))
(newline)
(let ((scaled-avg (i/ (* avg 1000) samples))
(scaled-dev (i/ (* dev 1000) samples)))
(for-each display
(list " That is about "
(around scaled-avg 4) ".ms/kB"
" +/- "
(around scaled-dev 2) ".ms/kB"))
(newline)
(and file (transcript-off)))))))))
(benchmark-prng)
(newline)
(benchmark-pi)
|