(Arne Babenhauserheide)
2017-03-31: add more tests, plans and a plot title option add more tests, plans and a plot title option
diff --git a/examples/benchmark.w b/examples/benchmark.w --- a/examples/benchmark.w +++ b/examples/benchmark.w @@ -10,6 +10,7 @@ import : statprof ice-9 format srfi srfi-1 srfi srfi-42 ; list-ec + srfi srfi-43 ; vector-append ice-9 pretty-print system vm program @@ -114,6 +115,7 @@ define : logiota steps start stepsize logstep : / (- (log (+ start (* stepsize (- steps 1)))) logstart) (- steps 1) map inexact->exact : map round : map exp : iota steps logstart logstep + define : bench-append param-list . "Test (append a b) with lists of lengths from the param-list." zip param-list @@ -123,23 +125,6 @@ define : bench-append param-list benchmark (append a b) :let ((a (iota N))(b (iota m))) . param-list -define : benchmark-list-append-N-1 steps - . "Test (append a b) with lists with lengths N and 1." - bench-append (zip (logiota steps 1 1000) (logiota steps 1 0)) - -define : benchmark-list-append-N-100 steps - . "Test (append a b) with lists with lengths N and 1." - bench-append (zip (logiota steps 1 1000) (logiota steps 100 0)) - -define : benchmark-list-append-1-m steps - . "Test (append a b) with lists with lengths N and 1." - bench-append (zip (logiota steps 1 0) (logiota steps 1 1000)) - -define : benchmark-list-append-100-m steps - . "Test (append a b) with lists with lengths N and 1." - bench-append (zip (logiota steps 100 0) (logiota steps 1 1000)) - - define : bench-append-string param-list . "Test (append a b) with lists of lengths from the param-list." zip param-list @@ -149,21 +134,50 @@ define : bench-append-string param-list benchmark (string-append a b) :let ((a (make-string N))(b (make-string m))) . param-list -define : benchmark-string-append-N-1 steps - . "Test (append a b) with lists with lengths N and 1." - bench-append-string (zip (logiota steps 1 1000) (logiota steps 1 0)) +define : bench-append-vector param-list + . "Test (append a b) with lists of lengths from the param-list." + zip param-list + map + lambda (x) + let : (N (list-ref x 0)) (m (list-ref x 1)) + benchmark (vector-append a b) :let ((a (make-vector N 1))(b (make-vector m 1))) + . param-list -define : benchmark-string-append-N-100 steps - . "Test (append a b) with lists with lengths N and 1." - bench-append-string (zip (logiota steps 1 1000) (logiota steps 100 0)) +define : bench-assoc param-list + . "Test (append a b) with lists of lengths from the param-list." + zip param-list + map + lambda (x) + let : (N (list-ref x 0)) (m (list-ref x 1)) + benchmark (assoc a b) :let ((a m)(b (fold (λ (x y z) (acons x y z)) '() (iota N 1) (iota N 1)))) + . param-list -define : benchmark-string-append-1-m steps - . "Test (append a b) with lists with lengths N and 1." - bench-append-string (zip (logiota steps 1 0) (logiota steps 1 1000)) +define : bench-cons param-list + . "Test (cons a b) with element A and list B of lengths from the param-list." + zip param-list + map + lambda (x) + let : (N (list-ref x 0)) (m (list-ref x 1)) + benchmark (cons a b) :let ((a m)(b (iota N))) + . param-list -define : benchmark-string-append-100-m steps - . "Test (append a b) with lists with lengths N and 1." - bench-append-string (zip (logiota steps 100 0) (logiota steps 1 1000)) +define : bench-car param-list + . "Test (cons a b) with element A and list B of lengths from the param-list." + zip param-list + map + lambda (x) + let : (N (list-ref x 0)) (m (list-ref x 1)) + benchmark (car b) :let ((b (iota N))) + . param-list + +define : bench-cdr param-list + . "Test (cons a b) with element A and list B of lengths from the param-list." + zip param-list + map + lambda (x) + let : (N (list-ref x 0)) (m (list-ref x 1)) + benchmark (cdr b) :let ((b (iota N))) + . param-list ;; prepare a multi-function fit @@ -252,7 +266,7 @@ define : flatten li append-ec (: i li) i ;; TODO: add filename and title and fix the units -define* : plot-benchmark-result bench H #:key filename +define* : plot-benchmark-result bench H #:key filename title let* : ensemble-member-count 128 ensemble-member-plot-skip 16 ;; must not be zero! @@ -329,7 +343,7 @@ scalarMap = mpl.cm.ScalarMappable(norm=c format port "pl.legend(loc='upper left', fancybox=True, framealpha=0.5)\n" format port "pl.xlabel('position [arbitrary units]')\n" format port "pl.ylabel('value [arbitrary units]')\n" - format port "pl.title('~A')\n" "Operation scaling behaviour" + format port "pl.title('~A')\n" : or title "Operation scaling behaviour" format port "pl.xscale('log')\n" ;; format port "pl.yscale('log')\n" if filename @@ -344,11 +358,59 @@ define : main args : H : lambda (x pos) (H-N-m x pos #:const #t #:ON #t #:ONlogN #t #:OlogN #:Ologm #:Om #:Omlogm) steps 20 pbr plot-benchmark-result - pbr (benchmark-list-append-N-1 steps) H #:filename "/tmp/benchmark-N-1.pdf" - pbr (benchmark-list-append-N-100 steps) H #:filename "/tmp/benchmark-N-100.pdf" - pbr (benchmark-list-append-1-m steps) H #:filename "/tmp/benchmark-1-m.pdf" - pbr (benchmark-list-append-100-m steps) H #:filename "/tmp/benchmark-100-m.pdf" - pbr (benchmark-string-append-N-1 steps) H #:filename "/tmp/benchmark-string-N-1.pdf" - pbr (benchmark-string-append-N-100 steps) H #:filename "/tmp/benchmark-string-N-100.pdf" - pbr (benchmark-string-append-1-m steps) H #:filename "/tmp/benchmark-string-1-m.pdf" - pbr (benchmark-string-append-100-m steps) H #:filename "/tmp/benchmark-string-100-m.pdf" + let lp + : N-start '(1 1 1 100) + N-step '(1000 1000 0 0) + m-start '(1 100 1 1) + m-step '(0 0 1000 1000) + cond + : null? N-start + . #t + else + let* + : N : car N-start + dN : car N-step + m : car m-start + dm : car m-step + param-list : zip (logiota steps N dN) (logiota steps m dm) + when : equal? dm 0 ;; only over N + pbr (bench-cons param-list) H #:filename + format #f "/tmp/benchmark-cons-~a-~a.pdf" + if (equal? dN 0) N "N" + . m + pbr (bench-car param-list) H #:filename + format #f "/tmp/benchmark-car-~a-~a.pdf" + if (equal? dN 0) N "N" + . m + pbr (bench-cdr param-list) H #:filename + format #f "/tmp/benchmark-cdr-~a-~a.pdf" + if (equal? dN 0) N "N" + . m + pbr (bench-append param-list) H #:filename + format #f "/tmp/benchmark-list-append-~a-~a.pdf" + if (equal? dN 0) N "N" + if (equal? dm 0) m "m" + pbr (bench-append-string param-list) H #:filename + format #f "/tmp/benchmark-string-append-~a-~a.pdf" + if (equal? dN 0) N "N" + if (equal? dm 0) m "m" + pbr (bench-append-vector param-list) H #:filename + format #f "/tmp/benchmark-vector-append-~a-~a.pdf" + if (equal? dN 0) N "N" + if (equal? dm 0) m "m" + pbr (bench-assoc param-list) H + . #:title "assoc m '((N . N) (N-1 . N-1) ... )" + . #:filename + format #f "/tmp/benchmark-assoc-~a-~a.pdf" + if (equal? dN 0) N "N" + if (equal? dm 0) m "m" + ;; interesting functions: + ;; - add to set/alist/hashmap + ;; - retrieve from alist/hashmap + ;; - sort + ;; - ... see https://wiki.python.org/moin/TimeComplexity + lp + cdr N-start + cdr N-step + cdr m-start + cdr m-step