426 lines
9.2 KiB
Plaintext
426 lines
9.2 KiB
Plaintext
|
#! /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 dderiv destruc diviter divrec puzzle triangl tak takl ntakl cpstak ctak"
|
||
|
|
||
|
NUM_BENCHMARKS="fib fibc fibfp sum sumfp fft mbrot mbrotZ nucleic pnpoly"
|
||
|
|
||
|
KVW_BENCHMARKS="ack array1 string sum1 cat cat2 cat3 tail wc"
|
||
|
|
||
|
IO_BENCHMARKS="read0 read1 read2 read3"
|
||
|
|
||
|
OTHER_BENCHMARKS="bibfreq bibfreq2 compiler conform dynamic earley graphs lattice matrix maze mazefun nqueens paraffins parsing peval pi primes quicksort ray scheme simplex slatex"
|
||
|
|
||
|
GC_BENCHMARKS="nboyer sboyer gcbench mperm"
|
||
|
|
||
|
SYNTH_BENCHMARKS="equal normalization bv2string listsort vecsort hashtable0"
|
||
|
|
||
|
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.
|
||
|
|
||
|
LARCENY=${LARCENY:-"../../../larceny"}
|
||
|
PETIT=${PETIT:-"../../../petit-larceny"}
|
||
|
PLTR6RS=${PLTR6RS:-"plt-r6rs"}
|
||
|
YPSILON=${YPSILON:-"ypsilon"}
|
||
|
MOSH=${MOSH:-"mosh"}
|
||
|
PETITE=${PETITE:-"petite"}
|
||
|
|
||
|
}
|
||
|
|
||
|
setup
|
||
|
|
||
|
# -----------------------------------------------------------------------------
|
||
|
|
||
|
error ()
|
||
|
{
|
||
|
echo $1
|
||
|
echo '
|
||
|
Usage: bench [-r runs] <system> <benchmark>
|
||
|
|
||
|
<system> is the abbreviated name of the implementation to benchmark:
|
||
|
|
||
|
ikarus for Ikarus
|
||
|
larceny for Larceny
|
||
|
mosh for Mosh
|
||
|
petit for Petit Larceny
|
||
|
petite for Petite Chez
|
||
|
plt for PLT Scheme
|
||
|
ypsilon for Ypsilon
|
||
|
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}
|
||
|
make_src_code $1
|
||
|
echo Compiling...
|
||
|
$COMP "${TEMP}/$1.${EXTENSION}"
|
||
|
i=0
|
||
|
while [ "$i" -lt "$NB_RUNS" ]
|
||
|
do
|
||
|
echo Running...
|
||
|
$EXEC "${TEMP}/$1.${EXTENSIONCOMP}" "${INPUTS}/$1.input"
|
||
|
i=`expr $i + 1`
|
||
|
done
|
||
|
} 2>&1 | tee -a results.${NAME}
|
||
|
|
||
|
}
|
||
|
|
||
|
make_src_code ()
|
||
|
{
|
||
|
cat "${SRC}/$1.sch" "${SRC}/common.sch" > "${TEMP}/$1.${EXTENSION}"
|
||
|
}
|
||
|
|
||
|
# -----------------------------------------------------------------------------
|
||
|
# Definitions specific to Larceny and Petit Larceny
|
||
|
#
|
||
|
# The --nocontract command-line option reduces variability
|
||
|
# of timing, and probably corresponds to the default for
|
||
|
# most other systems.
|
||
|
|
||
|
larceny_comp ()
|
||
|
{
|
||
|
echo "(import (larceny compiler)) (compile-file \"$1\")" \
|
||
|
| time "${LARCENY}" -err5rs -- -e "(repl-prompt values)"
|
||
|
}
|
||
|
|
||
|
larceny_exec ()
|
||
|
{
|
||
|
time "${LARCENY}" --nocontract --r6rs --program "$1" < "$2"
|
||
|
}
|
||
|
|
||
|
petit_comp ()
|
||
|
{
|
||
|
echo "(import (larceny compiler)) (compile-file \"$1\")" \
|
||
|
| time "${PETIT}" -err5rs -- -e "(repl-prompt values)"
|
||
|
}
|
||
|
|
||
|
petit_exec ()
|
||
|
{
|
||
|
time "${PETIT}" --nocontract --r6rs --program "$1" < "$2"
|
||
|
}
|
||
|
|
||
|
henchman_comp ()
|
||
|
{
|
||
|
echo "(import (larceny compiler)) (compile-file \"$1\")" \
|
||
|
| time "${HENCHMAN}" -err5rs -- -e "(repl-prompt values)"
|
||
|
}
|
||
|
|
||
|
henchman_exec ()
|
||
|
{
|
||
|
time "${HENCHMAN}" --nocontract --r6rs --program "$1" < "$2"
|
||
|
}
|
||
|
|
||
|
# -----------------------------------------------------------------------------
|
||
|
# Definitions specific to Ikarus
|
||
|
|
||
|
ikarus_comp ()
|
||
|
{
|
||
|
:
|
||
|
}
|
||
|
|
||
|
ikarus_exec ()
|
||
|
{
|
||
|
time "${IKARUS}" --r6rs-script "$1" < "$2"
|
||
|
}
|
||
|
|
||
|
# -----------------------------------------------------------------------------
|
||
|
# Definitions specific to PLT Scheme
|
||
|
|
||
|
plt_comp ()
|
||
|
{
|
||
|
echo | time "${PLTR6RS}" --compile "$1"
|
||
|
}
|
||
|
|
||
|
plt_exec ()
|
||
|
{
|
||
|
time "${PLTR6RS}" "$1" < "$2"
|
||
|
}
|
||
|
|
||
|
# -----------------------------------------------------------------------------
|
||
|
# Definitions specific to Ypsilon
|
||
|
|
||
|
ypsilon_comp ()
|
||
|
{
|
||
|
:
|
||
|
}
|
||
|
|
||
|
ypsilon_exec ()
|
||
|
{
|
||
|
time "${YPSILON}" "$1" < "$2"
|
||
|
}
|
||
|
|
||
|
# -----------------------------------------------------------------------------
|
||
|
# Definitions specific to Mosh
|
||
|
|
||
|
mosh_comp ()
|
||
|
{
|
||
|
:
|
||
|
}
|
||
|
|
||
|
mosh_exec ()
|
||
|
{
|
||
|
time "${MOSH}" "$1" < "$2"
|
||
|
}
|
||
|
|
||
|
# -----------------------------------------------------------------------------
|
||
|
# Definitions specific to Petite Chez
|
||
|
|
||
|
petite_comp ()
|
||
|
{
|
||
|
:
|
||
|
}
|
||
|
|
||
|
petite_exec ()
|
||
|
{
|
||
|
time "${PETITE}" --optimize-level 2 --program "$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
|
||
|
|
||
|
larceny) NAME='Larceny'
|
||
|
COMP=larceny_comp
|
||
|
EXEC=larceny_exec
|
||
|
COMPOPTS=""
|
||
|
EXTENSION="sch"
|
||
|
EXTENSIONCOMP="slfasl"
|
||
|
COMPCOMMANDS=""
|
||
|
EXECCOMMANDS=""
|
||
|
;;
|
||
|
|
||
|
petit) NAME='PetitLarceny'
|
||
|
COMP=petit_comp
|
||
|
EXEC=petit_exec
|
||
|
COMPOPTS=""
|
||
|
EXTENSION="sch"
|
||
|
EXTENSIONCOMP="slfasl"
|
||
|
COMPCOMMANDS=""
|
||
|
EXECCOMMANDS=""
|
||
|
;;
|
||
|
|
||
|
henchman) NAME='Henchman'
|
||
|
COMP=henchman_comp
|
||
|
EXEC=henchman_exec
|
||
|
COMPOPTS=""
|
||
|
EXTENSION="sch"
|
||
|
EXTENSIONCOMP="slfasl"
|
||
|
COMPCOMMANDS=""
|
||
|
EXECCOMMANDS=""
|
||
|
;;
|
||
|
|
||
|
ikarus) NAME='Ikarus'
|
||
|
COMP=ikarus_comp
|
||
|
EXEC=ikarus_exec
|
||
|
COMPOPTS=""
|
||
|
EXTENSION="sch"
|
||
|
EXTENSIONCOMP="sch"
|
||
|
COMPCOMMANDS=""
|
||
|
EXECCOMMANDS=""
|
||
|
;;
|
||
|
|
||
|
plt) NAME='PLT'
|
||
|
COMP=plt_comp
|
||
|
EXEC=plt_exec
|
||
|
COMPOPTS=""
|
||
|
EXTENSION="sch"
|
||
|
EXTENSIONCOMP="sch"
|
||
|
COMPCOMMANDS=""
|
||
|
EXECCOMMANDS=""
|
||
|
;;
|
||
|
|
||
|
ypsilon) NAME='Ypsilon' # copied from Ikarus' settings...
|
||
|
COMP=ypsilon_comp
|
||
|
EXEC=ypsilon_exec
|
||
|
COMPOPTS=""
|
||
|
EXTENSION="sch"
|
||
|
EXTENSIONCOMP="sch"
|
||
|
COMPCOMMANDS=""
|
||
|
EXECCOMMANDS=""
|
||
|
;;
|
||
|
|
||
|
mosh) NAME='Mosh'
|
||
|
COMP=mosh_comp
|
||
|
EXEC=mosh_exec
|
||
|
COMPOPTS=""
|
||
|
EXTENSION="sch"
|
||
|
EXTENSIONCOMP="sch"
|
||
|
COMPCOMMANDS=""
|
||
|
EXECCOMMANDS=""
|
||
|
;;
|
||
|
|
||
|
petite) NAME='Petite'
|
||
|
COMP=petite_comp
|
||
|
EXEC=petite_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
|