| #!/bin/bash |
| # -*- scheme -*- |
| exec guile -s $0 "$@" |
| !# |
| |
| ;; Quick hack to make some data files that gnuplot can read from |
| ;; complexity. Guile 1.6. |
| |
| (use-modules (srfi srfi-13) |
| (srfi srfi-1) |
| (ice-9 optargs) |
| (ice-9 popen)) |
| |
| (define *phases* '(create set run destroy)) |
| |
| (define (read-lines port) |
| (let lp ((lines '())) |
| (let ((x (read-line port))) |
| (if (eof-object? x) |
| (begin |
| (close-port port) |
| (reverse! lines)) |
| (lp (cons x lines)))))) |
| |
| (define (parse-time str) |
| (and (char-numeric? (string-ref str 0)) |
| (fold (lambda (x ret) (+ (* ret 60) x)) 0 |
| (map (lambda (x) (with-input-from-string x read)) |
| (string-split str #\:))))) |
| |
| (define (run-test program . args) |
| (format #t "; running test: ~a\n" (cons program args)) |
| (map |
| cons |
| *phases* |
| (filter-map |
| parse-time |
| (read-lines |
| (open-input-pipe |
| (string-join (map object->string (cons program args)) " ")))))) |
| |
| (define (seq start stop step) |
| (let lp ((n start) (out '())) |
| (if (> n stop) |
| (reverse! out) |
| (lp (+ n step) (cons n out))))) |
| |
| (define (run-tests n-elements) |
| (let lp ((x 1) (out '())) |
| (if (> x n-elements) |
| (reverse! out) |
| (lp (* x 2) |
| (acons x (run-test "./complexity" x n-elements) out))))) |
| |
| (define (output-results results) |
| (let ((p (open-output-file "complexity.data"))) |
| (display "#complexity creation state-change run destroy\n" p) |
| (for-each |
| (lambda (line) |
| (display (car line) p) |
| (for-each |
| (lambda (t) (format p " ~a" t)) |
| (map cdr (cdr line))) |
| (newline p)) |
| results) |
| (close-port p))) |
| |
| (output-results |
| (apply run-tests (map string->number (cdr (program-arguments))))) |