(use-modules (srfi srfi-13) (charting)) (define (observations->data observations) (define (mean l) (/ (apply + l) (length l))) (define (s->ms v) (* v 1000)) (map (lambda (group) (cons (car group) (map (lambda (observation) (let ((tbar (mean (cdr observation)))) `(,(s->ms tbar) ,(car observation) (#:y-bracket ,(s->ms (sqrt (mean (map (lambda (x) (expt (- x tbar) 2)) (cdr observation))))))))) (cdr group)))) observations)) (define *observations* '(("Initialization" ("Python 2.5.1" ;; bash -c 'TIMEFORMAT=%R; python --version; for i in `seq 50`; do time python -c 1; done' 0.027 0.029 0.028 0.027 0.027 0.027 0.027 0.027 0.027 0.027 0.027 0.027 0.027 0.028 0.027 0.028 0.028 0.027 0.027 0.027 0.028 0.028 0.027 0.027 0.028 0.028 0.027 0.028 0.027 0.027 0.027 0.028 0.027 0.027 0.027 0.027 0.027 0.027 0.028 0.027 0.027 0.027 0.027 0.027 0.027 0.027 0.027 0.027 0.027 0.027 ) ("Guile 1.6.8" ;; bash -c 'TIMEFORMAT=%R; guile --version; for i in `seq 50`; do time guile -c 1; done' 0.035 0.035 0.034 0.035 0.035 0.034 0.035 0.034 0.034 0.035 0.034 0.034 0.035 0.041 0.034 0.034 0.034 0.034 0.034 0.035 0.034 0.034 0.035 0.035 0.034 0.034 0.034 0.036 0.034 0.034 0.034 0.035 0.035 0.035 0.036 0.034 0.034 0.034 0.034 0.034 0.034 0.035 0.034 0.035 0.035 0.034 0.034 0.035 0.036 0.035 ) ("Guile 1.8.2" ;; CFLAGS=-g -O2 ;; /opt/guile-1.8/env bash -c 'TIMEFORMAT=%R; guile --version; for i in `seq 50`; do time guile -c 1; done' 0.083 0.085 0.084 0.088 0.085 0.083 0.083 0.084 0.084 0.085 0.083 0.085 0.083 0.084 0.083 0.084 0.084 0.084 0.083 0.084 0.084 0.084 0.083 0.083 0.083 0.084 0.083 0.083 0.084 0.089 0.083 0.085 0.083 0.084 0.084 0.086 0.083 0.084 0.083 0.083 0.083 0.088 0.083 0.086 0.084 0.083 0.083 0.084 0.084 0.083 ) ("Guile HEAD 15 Jul" ;; /opt/guile-head/env bash -c 'TIMEFORMAT=%R; guile --version; for i in `seq 50`; do time guile -c 1; done' 0.090 0.089 0.089 0.089 0.089 0.090 0.090 0.090 0.089 0.090 0.090 0.089 0.090 0.089 0.089 0.089 0.089 0.089 0.090 0.089 0.089 0.089 0.091 0.090 0.088 0.090 0.090 0.089 0.089 0.091 0.089 0.089 0.091 0.089 0.090 0.102 0.089 0.090 0.090 0.089 0.090 0.090 0.090 0.090 0.090 0.090 0.089 0.089 0.089 0.095 ) ("Guile HEAD 04 Aug" ;; /opt/guile-head/env bash -c 'TIMEFORMAT=%R; guile --version; for i in `seq 50`; do time guile -c 1; done' 0.042 0.042 0.043 0.041 0.042 0.041 0.042 0.041 0.041 0.043 0.041 0.041 0.042 0.041 0.041 0.041 0.042 0.041 0.041 0.041 0.041 0.042 0.041 0.042 0.042 0.041 0.041 0.041 0.042 0.041 0.041 0.042 0.041 0.042 0.041 0.042 0.041 0.042 0.042 0.041 0.042 0.042 0.041 0.041 0.041 0.042 0.041 0.048 0.042 0.041 ) ("SCM 5e3" ;; bash -c 'TIMEFORMAT=%R; scm --version; for i in `seq 50`; do time scm -c 1; done' 0.067 0.066 0.066 0.067 0.066 0.066 0.067 0.066 0.067 0.066 0.066 0.067 0.067 0.067 0.066 0.066 0.066 0.068 0.067 0.066 0.066 0.066 0.067 0.067 0.066 0.066 0.066 0.067 0.067 0.066 0.066 0.066 0.066 0.067 0.067 0.066 0.066 0.066 0.066 0.066 0.066 0.067 0.068 0.066 0.066 0.067 0.066 0.068 0.067 0.066 ) ) ("(use-modules (oop goops))" ("Guile 1.6.8" ;; bash -c 'TIMEFORMAT=%R; guile --version; for i in `seq 50`; do time guile -c "(use-modules (oop goops))"; done' 0.079 0.079 0.078 0.079 0.078 0.079 0.080 0.078 0.079 0.078 0.078 0.078 0.084 0.078 0.079 0.078 0.078 0.080 0.081 0.078 0.078 0.078 0.080 0.079 0.078 0.078 0.079 0.079 0.077 0.078 0.079 0.079 0.078 0.078 0.079 0.079 0.078 0.079 0.080 0.078 0.079 0.079 0.080 0.078 0.086 0.078 0.078 0.079 0.078 0.078 ) ("Guile 1.8.2" ;; /opt/guile-1.8/env bash -c 'TIMEFORMAT=%R; guile --version; for i in `seq 50`; do time guile -c "(use-modules (oop goops))"; done' 0.197 0.190 0.189 0.191 0.196 0.191 0.191 0.186 0.188 0.189 0.188 0.187 0.189 0.188 0.187 0.188 0.193 0.191 0.187 0.188 0.190 0.189 0.188 0.187 0.187 0.189 0.198 0.188 0.190 0.189 0.189 0.188 0.190 0.190 0.186 0.187 0.188 0.198 0.188 0.186 0.188 0.189 0.189 0.186 0.187 0.190 0.187 0.191 0.187 0.189 ) ("Guile HEAD 15 Jul" ;; /opt/guile-head/env bash -c 'TIMEFORMAT=%R; guile --version; for i in `seq 50`; do time guile -c "(use-modules (oop goops))"; done' 0.182 0.185 0.182 0.179 0.186 0.183 0.181 0.180 0.181 0.182 0.181 0.180 0.181 0.184 0.182 0.182 0.181 0.183 0.187 0.191 0.182 0.182 0.188 0.182 0.183 0.182 0.181 0.182 0.181 0.181 0.182 0.183 0.195 0.180 0.182 0.186 0.181 0.180 0.181 0.183 0.183 0.182 0.179 0.181 0.184 0.181 0.187 0.182 0.182 0.181 ) ("Guile HEAD 04 Aug" ;; /opt/guile-head/env bash -c 'TIMEFORMAT=%R; guile --version; for i in `seq 50`; do time guile -c "(use-modules (oop goops))"; done' 0.104 0.103 0.104 0.110 0.103 0.102 0.103 0.102 0.102 0.102 0.102 0.104 0.102 0.103 0.103 0.103 0.101 0.115 0.102 0.101 0.102 0.103 0.103 0.102 0.102 0.102 0.103 0.102 0.103 0.102 0.104 0.102 0.102 0.102 0.102 0.103 0.101 0.107 0.103 0.102 0.102 0.103 0.102 0.103 0.102 0.103 0.102 0.101 0.102 0.103 )))) (make-bar-chart "Guile Benchmarks" (observations->data *observations*) #:write-to-png "/tmp/guile-benchmarks.png" #:bar-width 40 #:group-spacing 40 #:chart-height 240 #:ytick-label-formatter (lambda (v) (format #f "~a" (inexact->exact (floor v)))) #:bar-value-formatter (lambda (v) (format #f "~a" v)) #:chart-params '(#:y-axis-label "Wall-clock execution time (ms)"))