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
 |