#!/usr/bin/env bash # For running R6RS benchmarks. # # Please report any errors or extensions to the author: # # William D Clinger (will@ccs.neu.edu) # # This script was loosely modelled after Marc Feeley's # script for benchmarking R5RS systems, with additional # contributions by Harvey Stein. # # Usage: # # % cd test/Benchmarking/R6RS # % ./bench # # For the current list of systems and benchmarks, run this # script with no arguments. # # The benchmarks must be contained within a src subdirectory # of the directory in which this script is run. # # The inputs to the benchmarks must be contained within an # inputs subdirectory of the directory in which this script # is run. OSNAME="`( uname )`" # The following definitions are not in use, but using them # might improve the script. HOME="`( pwd )`" SRC="${HOME}/src" INPUTS="${HOME}/inputs" # TEMP="/tmp/larcenous" ################################################################ GABRIEL_BENCHMARKS="browse deriv destruc diviter divrec puzzle triangl tak takl ntakl cpstak ctak" NUM_BENCHMARKS="fib fibc sum sumfp fft mbrot mbrotZ nucleic pnpoly" KVW_BENCHMARKS="ack array1 string sum1 cat tail wc" IO_BENCHMARKS="read1" OTHER_BENCHMARKS="compiler conform dynamic earley graphs lattice matrix mazefun nqueens paraffins parsing peval pi primes quicksort ray scheme simplex slatex" GC_BENCHMARKS="nboyer sboyer gcbench mperm" SYNTH_BENCHMARKS="equal" ALL_BENCHMARKS="$GABRIEL_BENCHMARKS $NUM_BENCHMARKS $KVW_BENCHMARKS $IO_BENCHMARKS $OTHER_BENCHMARKS $GC_BENCHMARKS $SYNTH_BENCHMARKS" ################################################################ NB_RUNS=1 clean=true options="" # On our Solaris machines, we can't install systems in # /usr/local, and some are in random places for historical # reasons. setup () { case ${OSNAME} in "SunOS") APPS="/proj/will/Apps" ;; "Linux") APPS="/usr/local" IKARUS="${APPS}/bin/ikarus" HENCHMAN="/home/henchman/bin/larceny" ;; "Darwin") IKARUS=${IKARUS:-"ikarus"} ;; esac # For both Solaris and Linux machines. SAGITTARIUS=${SAGITTARIUS:-"sash"} GAUCHE=${GAUCHE:-"gosh"} FOMENT=${FOMENT:-"foment"} HUSK=${HUSK:-"huski"} CHIBI=${CHIBI:-"chibi-scheme"} PICRIN=${PICRIN:-"picrin"} } setup # ----------------------------------------------------------------------------- error () { echo $1 echo ' Usage: bench [-r runs] is the abbreviated name of the implementation to benchmark: sagittarius for Sagittarius Scheme gauche for Gauche Scheme picrin for picrin Scheme all for all of the above is the name of the benchmark(s) to run: all for all of the usual benchmarks fib for the fib benchmark "fib ack" for the fib and ack benchmarks runs is the number of times to run each benchmark (default is 1).' exit } # ----------------------------------------------------------------------------- # FIXME: DANGER! DANGER! DANGER! # DON'T USE THIS UNTIL IT'S BEEN FIXED! cleanup () { if [ "$clean" = "true" ] ; then # It's true that technically speaking, we should be in the build # directory when this fcn is called. Thus, we should be able to # just do rm *. However, that's kind of dangerous, so instead, # we delete files newer than the mark file that evaluate () makes. for x in * ; do if [ $x -nt clean_newer_than_me ] ; then rm $x fi done fi rm clean_newer_than_me } evaluate () { # echo > clean_newer_than_me sleep 1 { echo echo Testing $1 under ${NAME} echo Compiling... # $COMP "${TEMP}/$1.${EXTENSION}" i=0 while [ "$i" -lt "$NB_RUNS" ] do echo Running... $EXEC "${SRC}/$1.sch" "${INPUTS}/$1.input" i=`expr $i + 1` done } 2>&1 | tee -a results.${NAME} } # ----------------------------------------------------------------------------- # Definitions specific to Sagittarius Scheme sagittarius_comp () { : } sagittarius_exec () { time "${SAGITTARIUS}" -t -n "$1" < "$2" } # ----------------------------------------------------------------------------- # Definitions specific to Gauche Scheme gauche_comp () { : } gauche_exec () { time "${GAUCHE}" -I. -r7 "$1" < "$2" } # ----------------------------------------------------------------------------- # Definitions specific to Foment foment_comp () { : } foment_exec () { time "${FOMENT}" "$1" < "$2" } # ----------------------------------------------------------------------------- # Definitions specific to Husk Scheme husk_comp () { : } husk_exec () { time "${HUSK}" "$1" < "$2" } # ----------------------------------------------------------------------------- # Definitions specific to Chibi Scheme chibi_comp () { : } chibi_exec () { time "${CHIBI}" "$1" < "$2" } # ----------------------------------------------------------------------------- # ----------------------------------------------------------------------------- # Definitions specific to picrin Scheme picrin_comp () { : } picrin_exec () { time "${PICRIN}" "$1" < "$2" } ## Arg processing... if [ "$#" -lt 2 ]; then error '>>> At least two command line arguments are needed' fi while [ $# -gt 2 ] ; do arg="$1" shift case $arg in -r) NB_RUNS=$1 ; shift ;; -c) clean=$1 ; shift ;; -o) options=$1 ; shift ;; *) error ">>> Unknown argument of $arg given." ;; esac done if [ "$#" -ne 2 ]; then error '>>> Last two arguments must be and ' fi case "$1" in all) systems="$ALL_SYSTEMS" ;; *) systems="$1" ;; esac case "$2" in all) benchmarks="$ALL_BENCHMARKS" ;; gabriel) benchmarks="$GABRIEL_BENCHMARKS" ;; kvw) benchmarks="$KVW_BENCHMARKS" ;; other) benchmarks="$OTHER_BENCHMARKS" ;; awk) benchmarks="$AWK_BENCHMARKS" ;; c) benchmarks="$C_BENCHMARKS" ;; java) benchmarks="$JAVA_BENCHMARKS" ;; *) benchmarks="$2" ;; esac ## Run each benchmark under each system... for system in $systems ; do case "$system" in sagittarius)NAME='Sagittarius' COMP=sagittarius_comp EXEC=sagittarius_exec COMPOPTS="" EXTENSION="sch" EXTENSIONCOMP="sch" COMPCOMMANDS="" EXECCOMMANDS="" ;; gauche)NAME='Gauche' COMP=gauche_comp EXEC=gauche_exec COMPOPTS="" EXTENSION="sch" EXTENSIONCOMP="sch" COMPCOMMANDS="" EXECCOMMANDS="" ;; chibi)NAME='Chibi' COMP=chibi_comp EXEC=chibi_exec COMPOPTS="" EXTENSION="sch" EXTENSIONCOMP="sch" COMPCOMMANDS="" EXECCOMMANDS="" ;; foment)NAME='Foment' COMP=foment_comp EXEC=foment_exec COMPOPTS="" EXTENSION="sch" EXTENSIONCOMP="sch" COMPCOMMANDS="" EXECCOMMANDS="" ;; husk)NAME='Husk' COMP=husk_comp EXEC=husk_exec COMPOPTS="" EXTENSION="sch" EXTENSIONCOMP="sch" COMPCOMMANDS="" EXECCOMMANDS="" ;; picrin)NAME='picrin' COMP=picrin_comp EXEC=picrin_exec COMPOPTS="" EXTENSION="sch" EXTENSIONCOMP="sch" COMPCOMMANDS="" EXECCOMMANDS="" ;; esac { echo echo '****************************' echo Benchmarking ${NAME} on `date` under `uname -a` } >> results.${NAME} # mkdir "${TEMP}" for program in $benchmarks ; do evaluate $program done done