369 lines
7.6 KiB
Bash
Executable File
369 lines
7.6 KiB
Bash
Executable File
#!/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 <system> <benchmark>
|
|
#
|
|
# 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] <system> <benchmark>
|
|
|
|
<system> 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
|
|
|
|
<benchmark> 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 <system> and <benchmark>'
|
|
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
|