picrin/etc/R7RS/bench

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