(use-modules (charting)) (define (observations->data observations) (define (mean l) (/ (apply + l) (length l))) (define (stddev l) (let ((xbar (mean l))) (sqrt (mean (map (lambda (x) (expt (- x xbar) 2)) l))))) (map (lambda (group) (cons (car group) (map (lambda (observation) (let ((tbar (mean (cddr observation)))) `(,tbar ,(car observation) (#:y-bracket ,(stddev (cddr observation)))))) (cdr group)))) observations)) ;; Hint: export TIMEFORMAT='%3R' (define *observations* '(("Initialization" ("Python 2.5.1c1" "for i in `seq 10`; do time python -c 1; done" 0.075 0.073 0.073 0.073 0.072 0.074 0.071 0.081 0.072 0.073) ("SCM 5e3" #f 0.099 0.099 0.098 0.100 0.097 0.101 0.096 0.096 0.098 0.106) ("Guile 1.6.8" "for i in `seq 10`; do time guile -c 1; done" 0.082 0.082 0.082 0.081 0.081 0.088 0.080 0.082 0.081 0.083) ("Guile 1.8 CVS" ;; with Ludovic's module lookup patch, CFLAGS=-g -O2 "for i in `seq 10`; do time guile -c 1; done" 0.143 0.141 0.139 0.139 0.138 0.140 0.148 0.147 0.149 0.160) ("Guile 1.8 CVS with TLS" "for i in `seq 10`; do time guile -c 1; done" 0.131 0.126 0.126 0.124 0.123 0.123 0.137 0.123 0.124 0.121) ) ("(use-modules (oop goops))" ("Guile 1.6.8" "for i in `seq 10`; do time guile -c '(use-modules (oop goops))'; done" 0.137 0.136 0.130 0.133 0.131 0.131 0.142 0.151 0.135 0.131 ) ("Guile 1.8 CVS" "for i in `seq 10`; do time guile -c '(use-modules (oop goops))'; done" 0.260 0.263 0.256 0.252 0.274 0.289 0.274 0.280 0.324 0.294) ("Guile 1.8 CVS with TLS" "for i in `seq 10`; do time guile -c '(use-modules (oop goops))'; done" 0.244 0.242 0.261 0.245 0.244 0.243 0.275 0.272 0.269 0.275)))) (make-bar-chart "Guile Benchmarks" (observations->data *observations*) :write-to-png "/tmp/guile-benchmarks.png" :bar-width 40 :group-spacing 40 :chart-height 240 :bar-value-format "~f" :chart-params '(:y-axis-label "Wall-clock execution time (s)"))