(Arne Babenhauserheide)
2017-03-20: added benchmarking code converted from my datatype benchmarks added benchmarking code converted from my datatype benchmarks
diff --git a/examples/benchmark.w b/examples/benchmark.w new file mode 100755 --- /dev/null +++ b/examples/benchmark.w @@ -0,0 +1,117 @@ +#!/usr/bin/env sh +# -*- wisp -*- +exec guile -L $(dirname $(dirname $(realpath "$0"))) --language=wisp -e '(@@ (examples benchmark) main)' -s "$0" "$@" +; !# + +define-module : examples benchmark + +import : statprof + ice-9 optargs + srfi srfi-1 + ice-9 pretty-print + system vm program + +define : benchmark-run fun + let profiler : : loop-num 100 + statprof-start + with-output-to-string + lambda () + let lp : (i loop-num) + fun + when (> i 0) + lp (- i 1) + statprof-stop + if : > (statprof-sample-count) 10 + / (statprof-accumulated-time) (statprof-sample-count) + profiler (* 10 loop-num) + +define loopcost + benchmark-run (λ() #f) + +;; TODO: Simplify #:key setup -> . setup +define* : benchmark-fun fun #:key setup + when setup + setup + - : benchmark-run fun + . loopcost + +define-syntax benchmark + ;; one single benchmark + lambda : x + syntax-case x (:let :setup) + : _ thunk :setup setup-thunk :let let-thunk args ... + #' benchmark thunk :let let-thunk :setup setup-thunk args ... + : _ thunk :let let-thunk :setup setup-thunk args ... + #' benchmark thunk :let let-thunk #:setup (lambda () setup-thunk) args ... + : _ thunk :setup setup-thunk args ... + #' benchmark thunk #:setup (lambda () setup-thunk) args ... + : _ thunk :let let-thunk args ... + #' let let-thunk + benchmark thunk args ... + : _ thunk args ... + #' benchmark-fun + . (lambda () thunk) args ... + +;; TODO: Use fit to different mappings. +define : mismatch-to-const-N-m timing-list + define : N-m x + define : const y + car : cdr x + map const : car x + map N-m timing-list + +define : mismatch-to-linear-N-m timing-list + define : N-m x + define : linear y + / (car (cdr x)) y + map linear : car x + map N-m timing-list + +define : benchmark-list-append + . "Test (append a b) with lists of different lengths." + define : bench-append param-list + zip param-list + map + lambda (x) + let : (N (list-ref x 0)) (m (list-ref x 1)) + benchmark (append a b) :let ((a (iota N))(b (iota m))) + . param-list + let : (steps 4) + concatenate + list + let : (param-list (zip (iota steps 1 1000) (iota steps 1 0))) + bench-append param-list + let : (param-list (zip (iota steps 1 0) (iota steps 1 100))) + bench-append param-list + let : (param-list (zip (iota steps 1 1000) (iota steps 1 0))) + bench-append param-list + let : (param-list (zip (iota steps 1 0) (iota steps 1 100))) + bench-append param-list + let : (param-list (zip (iota steps 1 1000) (iota steps 100000 0))) + bench-append param-list + let : (param-list (zip (iota steps 100000 0) (iota steps 1 100))) + bench-append param-list + +;; stddev from rosetta code: http://rosettacode.org/wiki/Standard_deviation#Scheme +define : stddev nums + sqrt + - + / : apply + : map (lambda (i) (* i i)) nums + length nums + expt (/ (apply + nums) (length nums)) 2 + +define : running-stddev nums + define : running-stddev-2 num + set! nums : cons num nums + stddev nums + . running-stddev-2 + +define : main args + map + lambda : mismatch-fun + write (procedure-name mismatch-fun) + newline + let : (mis (mismatch-fun (benchmark-list-append))) + map : lambda (x) : pretty-print (stddev x) + apply zip mis + list mismatch-to-const-N-m mismatch-to-linear-N-m