wisp
 
(Arne Babenhauserheide)
2017-03-23: Simplify and robustify benchmark (just the last loop in internal

Simplify and robustify benchmark (just the last loop in internal real time)

diff --git a/examples/benchmark.w b/examples/benchmark.w
--- a/examples/benchmark.w
+++ b/examples/benchmark.w
@@ -14,19 +14,37 @@ import : statprof
          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)
+
+;; 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* : benchmark-run fun #:key (min-seconds 0.1)
+  let profiler : (loop-num 10)
+    let : : t : get-internal-real-time
+      with-output-to-string
+        lambda ()
+          let lp : (i loop-num)
+            : λ () : fun
+            when (> i 0)
+              lp (- i 1)
+      let*
+        : dt : - (get-internal-real-time) t
+          seconds : / (exact->inexact dt) internal-time-units-per-second
+        pretty-print : list dt seconds loop-num
+        if : > seconds min-seconds
+            / seconds loop-num ;; this wastes less than {(10 * ((10^(i-1)) - 1)) / 10^i} fractional data but gains big in simplicity
+            profiler (* 10 loop-num)
 
 define loopcost
   benchmark-run (λ() #f)
@@ -74,7 +92,7 @@ define : benchmark-list-append
   let : (steps 100)
     concatenate
       list 
-        let : (param-list (zip (logiota steps 1 100) (logiota steps 1 0)))
+        let : (param-list (zip (logiota steps 1 10000) (logiota steps 1 0)))
                bench-append param-list
         ;; let : (param-list (zip (logiota steps 20 0) (logiota steps 1 10000)))
         ;;        bench-append param-list
@@ -87,20 +105,6 @@ define : benchmark-list-append
         ;; let : (param-list (zip (logiota steps 100000 0) (logiota steps 1 1000)))
         ;;        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
-
 
 ;; prepare a multi-function fit
 import