#!/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