Integrated the typed shootout benchmarks to the untyped harness.
This commit is contained in:
parent
d48f1bb6aa
commit
7f3db138e7
|
@ -2,4 +2,4 @@
|
|||
The program "run" should know how to run each benchmark with its
|
||||
standard input value. So run <benchmark.ss> like this:
|
||||
|
||||
racket run.rkt <benchmark.ss>
|
||||
racket run.rkt <benchmark.ss> [racket|typed-scheme|typed-scheme-optimizing]
|
||||
|
|
|
@ -9,7 +9,7 @@ exec racket -qu "$0" ${1+"$@"}
|
|||
(module auto scheme/base
|
||||
(require (for-syntax scheme/base)
|
||||
mzlib/process
|
||||
"../../common/cmdline.rkt"
|
||||
"../common/cmdline.rkt"
|
||||
mzlib/list
|
||||
mzlib/compile
|
||||
mzlib/inflate
|
||||
|
@ -33,38 +33,38 @@ exec racket -qu "$0" ${1+"$@"}
|
|||
(load script)))
|
||||
|
||||
(define (mk-racket bm)
|
||||
(unless (directory-exists? "../compiled")
|
||||
(make-directory "../compiled"))
|
||||
(unless (directory-exists? "compiled")
|
||||
(make-directory "compiled"))
|
||||
(parameterize ([current-namespace (make-base-namespace)]
|
||||
[read-accept-reader #t])
|
||||
(let ([name (format "~a.rkt" bm)])
|
||||
(compile-file (format "../~a" name)
|
||||
(build-path "../compiled" (path-add-suffix name #".zo"))))))
|
||||
(compile-file name
|
||||
(build-path "compiled" (path-add-suffix name #".zo"))))))
|
||||
|
||||
(define (clean-up-zo bm)
|
||||
(when (directory-exists? "../compiled")
|
||||
(delete-directory/files "../compiled")))
|
||||
(when (directory-exists? "compiled")
|
||||
(delete-directory/files "compiled")))
|
||||
|
||||
(define (mk-typed-scheme bm)
|
||||
(unless (directory-exists? "compiled")
|
||||
(make-directory "compiled"))
|
||||
(unless (directory-exists? "typed/compiled")
|
||||
(make-directory "typed/compiled"))
|
||||
(parameterize ([current-namespace (make-base-namespace)]
|
||||
[read-accept-reader #t])
|
||||
(let ([name (format "~a-non-optimizing.rkt" bm)])
|
||||
(compile-file name
|
||||
(build-path "compiled" (path-add-suffix name #".zo"))))))
|
||||
(compile-file (format "typed/~a" name)
|
||||
(build-path "typed/compiled" (path-add-suffix name #".zo"))))))
|
||||
(define (mk-typed-scheme-optimizing bm)
|
||||
(unless (directory-exists? "compiled")
|
||||
(make-directory "compiled"))
|
||||
(unless (directory-exists? "typed/compiled")
|
||||
(make-directory "typed/compiled"))
|
||||
(parameterize ([current-namespace (make-base-namespace)]
|
||||
[read-accept-reader #t])
|
||||
(let ([name (format "~a-optimizing.rkt" bm)])
|
||||
(compile-file name
|
||||
(build-path "compiled" (path-add-suffix name #".zo"))))))
|
||||
(compile-file (format "typed/~a" name)
|
||||
(build-path "typed/compiled" (path-add-suffix name #".zo"))))))
|
||||
|
||||
(define (clean-up-typed bm)
|
||||
(when (directory-exists? "compiled")
|
||||
(delete-directory/files "compiled")))
|
||||
(when (directory-exists? "typed/compiled")
|
||||
(delete-directory/files "typed/compiled")))
|
||||
|
||||
(define (extract-racket-times bm str)
|
||||
(let ([m (regexp-match #rx#"cpu time: ([0-9]+) real time: ([0-9]+) gc time: ([0-9]+)" str)])
|
||||
|
@ -136,7 +136,6 @@ exec racket -qu "$0" ${1+"$@"}
|
|||
pidigits1
|
||||
random
|
||||
recursive
|
||||
regexmatch
|
||||
regexpdna
|
||||
reversecomplement
|
||||
reversefile
|
||||
|
@ -148,7 +147,8 @@ exec racket -qu "$0" ${1+"$@"}
|
|||
wordfreq))
|
||||
|
||||
(define without-input-benchmarks
|
||||
'(spellcheck))
|
||||
'(regexmatch
|
||||
spellcheck))
|
||||
|
||||
(define (run-benchmark impl bm)
|
||||
(let ([i (ormap (lambda (i)
|
|
@ -1,52 +1,53 @@
|
|||
(module run mzscheme
|
||||
(require (only scheme/runtime-path define-runtime-path))
|
||||
(require (only scheme/runtime-path define-runtime-path)
|
||||
racket/port)
|
||||
(define input-map
|
||||
`(
|
||||
("ackermann.rkt" "11")
|
||||
("ary.rkt" "9000")
|
||||
("binarytrees.rkt" "16")
|
||||
("chameneos.rkt" "1000000")
|
||||
("cheapconcurrency.rkt" "15000")
|
||||
("echo.rkt" "150000")
|
||||
("except.rkt" "2500000")
|
||||
("fannkuch.rkt" "10")
|
||||
("fasta.rkt" "25000000")
|
||||
("fibo.rkt" "32")
|
||||
("hash.rkt" "100000")
|
||||
("hash2.rkt" "200")
|
||||
("heapsort.rkt" "100000")
|
||||
("lists.rkt" "18")
|
||||
("mandelbrot.rkt" "3000")
|
||||
("matrix.rkt" "600")
|
||||
("moments.rkt" #f ,(lambda () (mk-sumcol-input)))
|
||||
("nbody.rkt" "20000000")
|
||||
("nestedloop.rkt" "18")
|
||||
("nsieve.rkt" "9")
|
||||
("nsievebits.rkt" "11")
|
||||
("partialsums.rkt" "2500000")
|
||||
("pidigits.rkt" "2500")
|
||||
("pidigits1.rkt" "2500")
|
||||
("random.rkt" "900000")
|
||||
("recursive.rkt" "11")
|
||||
("regexmatch.rkt")
|
||||
("regexpdna.rkt" #f ,(lambda () (mk-regexpdna-input)))
|
||||
("reversecomplement.rkt" #f ,(lambda () (mk-revcomp-input)))
|
||||
("k-nucleotide.rkt" #f ,(lambda () (mk-knuc-input)))
|
||||
("reversefile.rkt" #f ,(lambda () (mk-sumcol-input)))
|
||||
("sieve.rkt" "1200")
|
||||
("spellcheck.rkt")
|
||||
("spectralnorm.rkt" "5500")
|
||||
("spectralnorm-unsafe.rkt" "5500")
|
||||
("strcat.rkt" "40000")
|
||||
("sumcol.rkt" #f ,(lambda () (mk-sumcol-input)))
|
||||
("wc.rkt" #f ,(lambda () (mk-sumcol-input)))
|
||||
("wordfreq.rkt" #f ,(lambda () (mk-sumcol-input)))
|
||||
("ackermann" "11")
|
||||
("ary" "9000")
|
||||
("binarytrees" "16")
|
||||
("chameneos" "1000000")
|
||||
("cheapconcurrency" "15000")
|
||||
("echo" "150000")
|
||||
("except" "2500000")
|
||||
("fannkuch" "10")
|
||||
("fasta" "25000000")
|
||||
("fibo" "32")
|
||||
("hash" "100000")
|
||||
("hash2" "200")
|
||||
("heapsort" "100000")
|
||||
("lists" "18")
|
||||
("mandelbrot" "3000")
|
||||
("matrix" "600")
|
||||
("moments" #f ,(lambda () (mk-sumcol-input)))
|
||||
("nbody" "20000000")
|
||||
("nestedloop" "18")
|
||||
("nsieve" "9")
|
||||
("nsievebits" "11")
|
||||
("partialsums" "2500000")
|
||||
("pidigits" "2500")
|
||||
("pidigits1" "2500")
|
||||
("random" "900000")
|
||||
("recursive" "11")
|
||||
("regexmatch")
|
||||
("regexpdna" #f ,(lambda () (mk-regexpdna-input)))
|
||||
("reversecomplement" #f ,(lambda () (mk-revcomp-input)))
|
||||
("k-nucleotide" #f ,(lambda () (mk-knuc-input)))
|
||||
("reversefile" #f ,(lambda () (mk-sumcol-input)))
|
||||
("sieve" "1200")
|
||||
("spellcheck")
|
||||
("spectralnorm" "5500")
|
||||
("strcat" "40000")
|
||||
("sumcol" #f ,(lambda () (mk-sumcol-input)))
|
||||
("wc" #f ,(lambda () (mk-sumcol-input)))
|
||||
("wordfreq" #f ,(lambda () (mk-sumcol-input)))
|
||||
))
|
||||
|
||||
(define-runtime-path here ".")
|
||||
|
||||
(define (dynreq f)
|
||||
(parameterize ([current-load-relative-directory here])
|
||||
(parameterize ([current-load-relative-directory here]
|
||||
[current-output-port (open-output-nowhere)])
|
||||
(dynamic-require f #f)))
|
||||
|
||||
(define (mk-fasta n suffix)
|
||||
|
@ -89,20 +90,28 @@
|
|||
|
||||
(define iters
|
||||
(let ([len (vector-length (current-command-line-arguments))])
|
||||
(unless (<= 1 len 2)
|
||||
(printf "provide ~athe name of a benchmark on the command line and an optional iteration count\n"
|
||||
(unless (<= 1 len 3)
|
||||
(printf "provide ~athe name of a benchmark on the command line, an optional version of the benchmark to run, and an optional iteration count\n"
|
||||
(if (zero? len) "" "ONLY "))
|
||||
(exit))
|
||||
(if (= len 2)
|
||||
(string->number (vector-ref (current-command-line-arguments) 1))
|
||||
(if (= len 3)
|
||||
(string->number (vector-ref (current-command-line-arguments) 2))
|
||||
1)))
|
||||
|
||||
(let ([prog (vector-ref (current-command-line-arguments) 0)])
|
||||
(let ([m (assoc prog input-map)])
|
||||
(let* ([version (if (< (vector-length (current-command-line-arguments)) 2)
|
||||
"racket"
|
||||
(vector-ref (current-command-line-arguments) 1))]
|
||||
[bench (vector-ref (current-command-line-arguments) 0)]
|
||||
[prog (cond
|
||||
((string=? version "racket") (format "~a.rkt" bench))
|
||||
((string=? version "typed-scheme") (format "typed/~a-non-optimizing.rkt" bench))
|
||||
((string=? version "typed-scheme-optimizing") (format "typed/~a-optimizing.rkt" bench))
|
||||
(else (error 'run "unknown version ~a" version)))])
|
||||
(let ([m (assoc bench input-map)])
|
||||
(unless m
|
||||
(error 'run "cannot find input for ~a" prog))
|
||||
(error 'run "cannot find input for ~a" bench))
|
||||
(when (null? (cdr m))
|
||||
(error 'run "don't know input for ~a" prog))
|
||||
(error 'run "don't know input for ~a" bench))
|
||||
(let loop ([n iters])
|
||||
(parameterize ([current-command-line-arguments
|
||||
(if (cadr m)
|
||||
|
|
|
@ -1,128 +0,0 @@
|
|||
(module run mzscheme
|
||||
(require (only scheme/runtime-path define-runtime-path)
|
||||
racket/port)
|
||||
(define input-map
|
||||
`(
|
||||
("ackermann" "11")
|
||||
("ary" "9000")
|
||||
("binarytrees" "16")
|
||||
("chameneos" "1000000")
|
||||
("cheapconcurrency" "15000")
|
||||
("echo" "150000")
|
||||
("except" "2500000")
|
||||
("fannkuch" "10")
|
||||
("fasta" "25000000")
|
||||
("fibo" "32")
|
||||
("hash" "100000")
|
||||
("hash2" "200")
|
||||
("heapsort" "100000")
|
||||
("lists" "18")
|
||||
("mandelbrot" "3000")
|
||||
("matrix" "600")
|
||||
("moments" #f ,(lambda () (mk-sumcol-input)))
|
||||
("nbody" "20000000")
|
||||
("nestedloop" "18")
|
||||
("nsieve" "9")
|
||||
("nsievebits" "11")
|
||||
("partialsums" "2500000")
|
||||
("pidigits" "2500")
|
||||
("pidigits1" "2500")
|
||||
("random" "900000")
|
||||
("recursive" "11")
|
||||
("regexmatch")
|
||||
("regexpdna" #f ,(lambda () (mk-regexpdna-input)))
|
||||
("reversecomplement" #f ,(lambda () (mk-revcomp-input)))
|
||||
("k-nucleotide" #f ,(lambda () (mk-knuc-input)))
|
||||
("reversefile" #f ,(lambda () (mk-sumcol-input)))
|
||||
("sieve" "1200")
|
||||
("spellcheck")
|
||||
("spectralnorm" "5500")
|
||||
("spectralnorm-unsafe" "5500")
|
||||
("strcat" "40000")
|
||||
("sumcol" #f ,(lambda () (mk-sumcol-input)))
|
||||
("wc" #f ,(lambda () (mk-sumcol-input)))
|
||||
("wordfreq" #f ,(lambda () (mk-sumcol-input)))
|
||||
))
|
||||
|
||||
(define-runtime-path here ".")
|
||||
|
||||
(define (dynreq f)
|
||||
(parameterize ([current-load-relative-directory here]
|
||||
[current-output-port (open-output-nowhere)])
|
||||
(dynamic-require f #f)))
|
||||
|
||||
(define (mk-fasta n suffix)
|
||||
(let ([f (build-path (find-system-path 'temp-dir) (string-append "fasta-" suffix))])
|
||||
(unless (file-exists? f)
|
||||
(printf "Building FASTA ~a output for input: ~a\n" n f)
|
||||
(with-output-to-file f
|
||||
(lambda ()
|
||||
(parameterize ([current-command-line-arguments (vector n)])
|
||||
(dynreq "../fasta.rkt"))))) ; we can use the untyped version to generate inputs
|
||||
f))
|
||||
|
||||
(define (mk-revcomp-input)
|
||||
(mk-fasta "2500000" "2m5"))
|
||||
|
||||
(define (mk-knuc-input)
|
||||
(mk-fasta "1000000" "1m"))
|
||||
|
||||
(define (mk-regexpdna-input)
|
||||
(mk-fasta "5000000" "5m"))
|
||||
|
||||
(define (mk-sumcol-input)
|
||||
(let ([f (build-path (find-system-path 'temp-dir) "sumcol-21k")])
|
||||
(unless (file-exists? f)
|
||||
(printf "Building sumcol 21000 input: ~a\n" f)
|
||||
(let ([c (with-input-from-file (build-path (collection-path "tests")
|
||||
"racket"
|
||||
"benchmarks"
|
||||
"shootout"
|
||||
"sumcol-input.txt")
|
||||
(lambda ()
|
||||
(read-bytes 10000)))])
|
||||
(with-output-to-file f
|
||||
(lambda ()
|
||||
(let loop ([n 21000])
|
||||
(unless (zero? n)
|
||||
(printf "~a" c)
|
||||
(loop (sub1 n))))))))
|
||||
f))
|
||||
|
||||
(define iters
|
||||
(let ([len (vector-length (current-command-line-arguments))])
|
||||
(unless (<= 2 len 3)
|
||||
(printf "provide ~athe name of a benchmark on the command line, which version of the benchmark to run, and an optional iteration count\n"
|
||||
(if (<= len 1) "" "ONLY "))
|
||||
(exit))
|
||||
(if (= len 3)
|
||||
(string->number (vector-ref (current-command-line-arguments) 2))
|
||||
1)))
|
||||
|
||||
(let* ([version (vector-ref (current-command-line-arguments) 1)] ; racket, typed-scheme, typed-scheme-optimizing
|
||||
[bench (vector-ref (current-command-line-arguments) 0)]
|
||||
[prog (cond
|
||||
((string=? version "racket") (format "../~a.rkt" bench))
|
||||
((string=? version "typed-scheme") (format "~a-non-optimizing.rkt" bench))
|
||||
((string=? version "typed-scheme-optimizing") (format "~a-optimizing.rkt" bench))
|
||||
(else (error 'run "unknown version ~a" version)))])
|
||||
(let ([m (assoc bench input-map)])
|
||||
(unless m
|
||||
(error 'run "cannot find input for ~a" bench))
|
||||
(when (null? (cdr m))
|
||||
(error 'run "don't know input for ~a" bench))
|
||||
(let loop ([n iters])
|
||||
(parameterize ([current-command-line-arguments
|
||||
(if (cadr m)
|
||||
(vector (cadr m))
|
||||
(vector))]
|
||||
[current-input-port
|
||||
(if (null? (cddr m))
|
||||
(current-input-port)
|
||||
(open-input-file ((caddr m))))])
|
||||
(parameterize ([current-namespace (make-namespace)])
|
||||
(collect-garbage)
|
||||
(collect-garbage)
|
||||
(time (dynreq prog))))
|
||||
(unless (= n 1)
|
||||
(loop (sub1 n)))))))
|
Loading…
Reference in New Issue
Block a user