| #!/bin/bash |
| # -*- scheme -*- |
| exec guile -s $0 "$@" |
| !# |
| |
| ;; Copyright (C) 2005 Andy Wingo |
| ;; |
| ;; This library is free software; you can redistribute it and/or |
| ;; modify it under the terms of the GNU Lesser General Public |
| ;; License as published by the Free Software Foundation; either |
| ;; version 2.1 of the License, or (at your option) any later version. |
| ;; |
| ;; This library is distributed in the hope that it will be useful, |
| ;; but WITHOUT ANY WARRANTY; without even the implied warranty of |
| ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| ;; Lesser General Public License for more details. |
| ;; |
| ;; You should have received a copy of the GNU Lesser General Public |
| ;; License along with this library; if not, write to the Free Software |
| ;; Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
| |
| ;; Quick hack to make some data files that gnuplot can read from |
| ;; complexity. Guile 1.8. |
| |
| (use-modules (srfi srfi-13) |
| (srfi srfi-1) |
| (ice-9 optargs) |
| (ice-9 popen) |
| (ice-9 rdelim)) |
| |
| (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))))) |