rsalz@uunet.uu.net (Rich Salz) (05/08/90)
Submitted-by: "Ben Smith @ BYTE" <ben@bytepb.byte.com> Posting-number: Volume 22, Issue 29 Archive-name: byte-benchmarks/part02 [ Look out for the BEL characters on line 94 of Run, and line 30 of sort.src. ] #! /bin/sh # This is a shell archive. Remove anything before this line, then unpack # it by saving it into a file and typing "sh file". To overwrite existing # files, type "sh file -c". You can also feed this as standard input via # unshar, or by typing "sh <file", e.g.. If this archive is complete, you # will see the following message at the end: # "End of archive 2 (of 5)." # Contents: Makefile Run dummy.c fstime.c precision.c sort.src # Wrapped by rsalz@papaya.bbn.com on Tue May 8 08:55:29 1990 PATH=/bin:/usr/bin:/usr/ucb ; export PATH if test -f 'Makefile' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'Makefile'\" else echo shar: Extracting \"'Makefile'\" \(7106 characters\) sed "s/^X//" >'Makefile' <<'END_OF_FILE' X############################################################################## X# The BYTE UNIX Benchmarks - Release 2 X# Module: Makefile SID: 2.10 4/17/90 16:45:28 X# X############################################################################## X# Bug reports, patches, comments, suggestions should be sent to: X# X# Ben Smith or Rick Grehan at BYTE Magazine X# bensmith@bytepb.UUCP rick_g@bytepb.UUCP X# X############################################################################## X# Modification Log: 7/28/89 cleaned out workload files X# 4/17/90 added routines for installing from shar mess X# X############################################################################## XID="@(#)Makefile:2.10 -- 4/17/90 16:45:28"; XSHELL = /bin/sh XUNIX = -DSysV #may be: SysV, BSD4v1, BSD4v2 XCFLAGS = $(UNIX) -DHZ=50 XOPTON = -O #optimization on (give it your best shot) X # -- check your compiler man XOPTOFF = -Od #optimization off -- check your compiler man X# local directories XBINDIR = ./pgms XSRCDIR = ./src XDOCDIR = ./doc XTESTDIR = ./testdir XRESULTDIR = ./resultdir XTMPDIR = ./tmpdir X# other directories XINCLDIR = /usr/include XLIBDIR = /lib XSCRIPTS = BSDtime.awk SysVtime.awk byte.logo \ X cleanup dbprep dhry.awk \ X fs.awk multi.sh \ X time.awk tst.sh XSOURCES = arith.c big.c buildbms.c \ X clock.c context1.c \ X dbmscli.c dbmserv.c dhry.c \ X dhry.h dummy.c execl.c \ X fstime.c getopt.c hanoi.c \ X limit.c mkperm.c \ X pipe.c precision.c spawn.c \ X syscall.c XDOCS = bench.doc XTESTS = sort.src cctest.c XPROGS = $(BINDIR)/arithoh $(BINDIR)/register $(BINDIR)/short \ X $(BINDIR)/int $(BINDIR)/long $(BINDIR)/float $(BINDIR)/double \ X $(BINDIR)/hanoi \ X $(BINDIR)/fstime $(BINDIR)/syscall $(BINDIR)/context1 \ X $(BINDIR)/pipe $(BINDIR)/spawn $(BINDIR)/execl \ X $(BINDIR)/dhry2 $(BINDIR)/dhry2reg $(BINDIR)/limit \ X $(BINDIR)/clock $(BINDIR)/precision $(BINDIR)/mkperm \ X $(BINDIR)/buildbms $(BINDIR)/dbmserv $(BINDIR)/dbmscli X X# ######################### the big ALL ############################ Xall: distr programs X X# distribute the files out to subdirectories if they are in this one Xdistr: X # scripts X if test ! -d $(BINDIR) \ X ; then \ X mkdir $(BINDIR) \ X ; mv $(SCRIPTS) $(BINDIR) \ X ; else \ X echo "$(BINDIR) exists" \ X ; fi X # C sources X if test ! -d $(SRCDIR) \ X ; then \ X mkdir $(SRCDIR) \ X ; mv $(SOURCES) $(SRCDIR) \ X ; else \ X echo "$(SRCDIR) exists" \ X ; fi X # test data X if test ! -d $(TESTDIR) \ X ; then \ X mkdir $(TESTDIR) \ X ; mv $(TESTS) $(TESTDIR) \ X ; else \ X echo "$(TESTDIR) exists" \ X ; fi X # documents directory X if test ! -d $(DOCDIR) \ X ; then \ X mkdir $(DOCDIR) \ X ; mv $(DOCS) $(DOCDIR) \ X ; else \ X echo "$(DOCDIR) exists" \ X ; fi X # temporary work directory X if test ! -d $(TMPDIR) \ X ; then \ X mkdir $(TMPDIR) \ X ; else \ X echo "$(TMPDIR) exists" \ X ; fi X # directory for results X if test ! -d $(RESULTDIR) \ X ; then \ X mkdir $(RESULTDIR) \ X ; else \ X echo "$(RESULTDIR) exists" \ X ; fi X chmod 744 * $(SRCDIR)/* $(BINDIR)/* $(TESTDIR)/* $(DOCDIR)/* X Xprograms: $(PROGS) X X# Individual programs X$(BINDIR)/arithoh: $(SRCDIR)/arith.c X cc -o $(BINDIR)/arithoh ${CFLAGS} ${OPTON} -Darithoh $(SRCDIR)/arith.c X$(BINDIR)/register: $(SRCDIR)/arith.c X cc -o $(BINDIR)/register ${CFLAGS} ${OPTON} -Ddatum=register $(SRCDIR)/arith.c X$(BINDIR)/short: $(SRCDIR)/arith.c X cc -o $(BINDIR)/short ${CFLAGS} ${OPTON} -Ddatum=short $(SRCDIR)/arith.c X$(BINDIR)/int: $(SRCDIR)/arith.c X cc -o $(BINDIR)/int ${CFLAGS} ${OPTON} -Ddatum=int $(SRCDIR)/arith.c X$(BINDIR)/long: $(SRCDIR)/arith.c X cc -o $(BINDIR)/long ${CFLAGS} ${OPTON} -Ddatum=long $(SRCDIR)/arith.c X$(BINDIR)/float: $(SRCDIR)/arith.c X cc -o $(BINDIR)/float ${CFLAGS} ${OPTON} -Ddatum=float $(SRCDIR)/arith.c X$(BINDIR)/double: $(SRCDIR)/arith.c X cc -o $(BINDIR)/double ${CFLAGS} ${OPTON} -Ddatum=double $(SRCDIR)/arith.c X$(BINDIR)/hanoi: $(SRCDIR)/hanoi.c X cc -o $(BINDIR)/hanoi ${CFLAGS} ${OPTON} $(SRCDIR)/hanoi.c X$(BINDIR)/fstime: $(SRCDIR)/fstime.c X cc -o $(BINDIR)/fstime ${CFLAGS} ${OPTON} -Dawk=1 $(SRCDIR)/fstime.c X$(BINDIR)/syscall: $(SRCDIR)/syscall.c X cc -o $(BINDIR)/syscall ${CFLAGS} ${OPTON} $(SRCDIR)/syscall.c X$(BINDIR)/context1: $(SRCDIR)/context1.c X cc -o $(BINDIR)/context1 ${CFLAGS} ${OPTON} $(SRCDIR)/context1.c X$(BINDIR)/pipe: $(SRCDIR)/pipe.c X cc -o $(BINDIR)/pipe ${CFLAGS} ${OPTON} $(SRCDIR)/pipe.c X$(BINDIR)/spawn: $(SRCDIR)/spawn.c X cc -o $(BINDIR)/spawn ${CFLAGS} ${OPTON} $(SRCDIR)/spawn.c X$(BINDIR)/execl: $(SRCDIR)/execl.c $(SRCDIR)/big.c X cc -o $(BINDIR)/execl ${CFLAGS} ${OPTON} $(SRCDIR)/execl.c X$(BINDIR)/keyb: $(SRCDIR)/keyb.c X cc -o $(BINDIR)/keyb ${CFLAGS} ${OPTON} $(SRCDIR)/keyb.c X$(BINDIR)/limit: $(SRCDIR)/limit.c X cc -o $(BINDIR)/limit ${CFLAGS} ${OPTON} $(SRCDIR)/limit.c X$(BINDIR)/dhry2: $(SRCDIR)/dhry.c $(SRCDIR)/dhry.h X cc -o $(BINDIR)/dhry2 ${CFLAGS} ${OPTON} $(SRCDIR)/dhry.c X$(BINDIR)/dhry2reg: $(SRCDIR)/dhry.c $(SRCDIR)/dhry.h X cc -o $(BINDIR)/dhry2reg -DREG=register ${CFLAGS} ${OPTON} $(SRCDIR)/dhry.c X$(BINDIR)/clock: $(SRCDIR)/clock.c X cc -o $(BINDIR)/clock ${CFLAGS} ${OPTON} $(SRCDIR)/clock.c X$(BINDIR)/precision: $(SRCDIR)/precision.c X cc -o $(BINDIR)/precision ${CFLAGS} ${OPTON} $(SRCDIR)/precision.c X$(BINDIR)/ttychk: $(SRCDIR)/ttychk.c X cc -o $(BINDIR)/ttychk ${CFLAGS} ${OPTON} $(SRCDIR)/ttychk.c X$(BINDIR)/mkperm: $(SRCDIR)/mkperm.c X cc -o $(BINDIR)/mkperm ${CFLAGS} ${OPTON} $(SRCDIR)/mkperm.c X$(BINDIR)/buildbms: $(SRCDIR)/buildbms.c X cc -o $(BINDIR)/buildbms ${CFLAGS} ${OPTON} $(SRCDIR)/buildbms.c X$(BINDIR)/dbmserv: $(SRCDIR)/dbmserv.c X cc -o $(BINDIR)/dbmserv ${CFLAGS} ${OPTON} $(SRCDIR)/dbmserv.c X$(BINDIR)/dbmscli: $(SRCDIR)/dbmscli.c X cc -o $(BINDIR)/dbmscli ${CFLAGS} ${OPTON} $(SRCDIR)/dbmscli.c X$(BINDIR)/autokb: $(SRCDIR)/autokb.c X cc -o $(BINDIR)/autokb ${CFLAGS} ${OPTON} $(SRCDIR)/autokb.c X X# SCCS stuff X Xdelta: X delta -y"development step" sccs/s.Run sccs/s.README X cd src; delta -y"development step" sccs X cd pgms; delta -y"development step" sccs X cd testdir; delta -y"development step" sccs X cd doc; delta -y"development step" sccs Xget: X get -e sccs/s.Run sccs/s.README X cd src; get -e sccs X cd pgms; get -e sccs X cd testdir; get -e sccs X cd doc; get -e sccs X chmod 744 $(SRCDIR)/* $(DATAFILES) X chmod 755 $(BINDIR)/* * Xrel: X #cd bench; find . -type f -print | rm -f X cd bench; get ../sccs X cd bench/src; get ../../src/sccs X cd bench/pgms; get ../../pgms/sccs X cd bench/testdir; get ../../testdir/sccs X cd bench/doc; get ../../doc/sccs X cd bench; chmod 744 src/* testdir/* X cd bench; chmod 755 * pgms/* X Xtar48: X format /dev/rdsk/f05d9t X tar cfb /dev/rdsk/f05d9t 20 bench X tar tf /dev/rdsk/f05d9t X Xtar96: X format /dev/rdsk/f05ht X tar cfb /dev/rdsk/f05ht 20 bench X tar tf /dev/rdsk/f05ht X Xtar135: X format /dev/rdsk/f13dt X tar cfb /dev/rdsk/f13dt 20 bench X tar tf /dev/rdsk/f13dt END_OF_FILE if test 7106 -ne `wc -c <'Makefile'`; then echo shar: \"'Makefile'\" unpacked with wrong size! fi chmod +x 'Makefile' # end of 'Makefile' fi if test -f 'Run' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'Run'\" else echo shar: Extracting \"'Run'\" \(13521 characters\) sed "s/^X//" >'Run' <<'END_OF_FILE' X#! /bin/sh X#################### set your default list of tests here ############## X XFULL_SUITE="dhry2 dhry2reg arithoh register short int long float double syscall pipe context1 spawn execl fstime shell dc hanoi" X X############################################################################### X# The BYTE UNIX Benchmarks - Release 2 X# Module: Run SID: 2.6 4/17/90 16:45:27 X# X############################################################################### X# Bug reports, patches, comments, suggestions should be sent to: X# X# Ben Smith, Rick Grehan, or Tom Yager at BYTE Magazine X# ben@bytepb.UUCP rick_g@bytepb.UUCP tyager@bytepb.UUCP X# BIX: bensmith rick_g tyager X# X############################################################################### X# Modification Log: X# $Header: run,v 5.2 88/01/12 06:23:43 kenj Exp $ X# Ken McDonell, Computer Science, Monash University X# August 1, 1983 X# 3/89 - Ben Smith - BYTE: globalized many variables, modernized syntax X# 5/89 - commented and modernized. Removed workload items till they X# have been modernized. Added database server test. X# 11/14/89 - Made modifications to reflect new version of fstime X# and elimination of mem tests. X# X############################################################################### XID="@(#)Run:2.6 -- 4/17/90 16:45:27"; Xversion="2.6" X####################################################################### X# General Purpose Benchmark X# based on the work by Ken McDonell, Computer Science, Monash University X# X# You will need ... X# awk cat cc chmod comm cp date dc df echo ed expr X# kill ls make mkdir rm sed test time touch tty umask who X# X# The following variables may be assigned external values to overide defaults X# X# Test Variable Default Use X# all iterations 6 repeat count for timing X# dhry dhryloops 10000 no. of loops to test X# arithmetic arithloop 10000 no. of summations X# hanoi ndisk 17 list of nos. of disks X# syscall ncall 4000 no. iterations, each of X# 5 system calls X# context1 switch1 500 no. of switches X# pipe io 2048 no. 512 byte blocks to read X# and write X# spawn children 100 no. of child processes X# execl nexecs 100 no. of execs X# fstime seconds 1 10 20 seconds X# Xumask 022 # at least mortals can read root's files this way X# establish full paths to directories XPWD=`pwd` XHOMEDIR=${HOMEDIR-.} Xcd $HOMEDIR XHOMEDIR=`pwd` Xcd $PWD X XBINDIR=${BINDIR-${HOMEDIR}/pgms} Xcd $BINDIR XBINDIR=`pwd` Xcd $PWD X# let's extend the path to this directory XPATH="${PATH}:${BINDIR}" X XSCRPDIR=${SCRPDIR-${HOMEDIR}/pgms} Xcd $SCRPDIR XSCRPDIR=`pwd` Xcd $PWD X XTMPDIR=${HOMEDIR}/tmp Xcd $TMPDIR XTMPDIR=`pwd` Xcd $PWD X XRESULTDIR=${RESULTDIR-${HOMEDIR}/results} Xcd $RESULTDIR XRESULTDIR=`pwd` Xcd $PWD X XTIMEACCUM=${TIMEACCUM-${RESULTDIR}/times} X XTESTDIR=${TESTDIR-${HOMEDIR}/testdir} Xcd $TESTDIR XTESTDIR=`pwd` Xcd $PWD X Xexport BINDIR TMPDIR RESULTDIR PATH TESTDIR TIMEACCUM X# Xbell="" Xbreak1="=============================================================================" Xbreak2="-----------------------------------------------------------------------------" X# Xcat ${BINDIR}/byte.logo # display banner Xrm -f ${TIMEACCUM} # clean out old time accumulation file Xecho "kill -9 $$" > ${TMPDIR}/kill_run ; chmod u+x ${TMPDIR}/kill_run X# Xarithmetic="arithoh register short int long float double" Xsystem="syscall pipe context1 spawn execl" Xmisc="C dc hanoi" Xdhry="dhry2 dhry2reg" # dhrystone loops Xload="shell" # cummulative load tests Xdb="dbmscli" # add to as new database engines are developed X# Xargs="" # the accumulator for the bench units to be run Xrunoption="N" X# generate list of bench programs Xfor word Xdo # do level 1 X case $word X in X all) X ;; X arithmetic) X args="$args $arithmetic" X ;; X db) X args="$args $db" X ;; X dhry) X args="$args $dhry" X ;; X load) X args="$args $load" X ;; X misc) X args="$args $misc" X ;; X speed) X args="$args $arithmetic $system" X ;; X system) X args="$args $system" X ;; X -q|-Q) X runoption="Q" #quiet X ;; X -v|-V) X runoption="V" #verbose X ;; X -d|-D) X runoption="D" #debug X ;; X *) X args="$args $word" X ;; X esac X Xdone # end do level 1 X#if no benchmark units have be specified, do them all X# the - option of set implies no options; any list following X# becomes the line arguments (replacing any that may exist) Xset - $args Xif test $# -eq 0 #no arguments specified X then X set - $FULL_SUITE Xfi X Xif test "$runoption" = 'D' Xthen X set -x X set -v Xfi X Xdate=`date` Xtmp=${TMPDIR}/$$.tmp Xtimeaccum=${TMPDIR}/time.accum XLOGFILE=${RESULTDIR}/log X#add old log to accumulated log or move it Xif test -w ${RESULTDIR}/log Xthen X if test -w ${RESULTDIR}/log.accum X then X cat ${RESULTDIR}/log >> ${RESULTDIR}/log.accum X rm ${RESULTDIR}/log X else X mv ${RESULTDIR}/log ${RESULTDIR}/log.accum X fi Xfi Xecho "Start Benchmark Run (BYTE Version $version)" >>$LOGFILE Xecho " $date " >>$LOGFILE Xecho " " `who | wc -l` "interactive users." >>$LOGFILE X#if SysV use 'uname -a' -- if BSD use 'hostname' Xuname -a >>$LOGFILE X# hostname >>$LOGFILE X# X#if not specified, do each bench 6 iterations Xiter=${iterations-6} Xif test $iter -eq 6 Xthen X longloop="1 2 3 4 5 6" X shortloop="1 2 3" Xelse # generate list of loop numbers X short=`expr \( $iter + 1 \) / 2` X longloop="" X shortloop="" X while test $iter -gt 0 X do # do level 1 X longloop="$iter $longloop" X if test $iter -le $short X then X shortloop="$iter $shortloop" X fi X iter=`expr $iter - 1` X done # end do level 1 Xfi #loop list genration X#################################################################### X############## the major control loop ############################## X#################################################################### Xfor bench # line argument processing Xdo # do level 1 X # set some default values X prog=${BINDIR}/$bench # the bench name is default program X need=$prog # we need the at least the program X paramlist="#" # a dummy parameter to make anything run X testdir="${TESTDIR}" # the directory in which to run the test X prepcmd="" # preparation command or script X parammsg="" X repeat="$longloop" X stdout="$LOGFILE" X stdin="" X cleanopt="-t $tmp" X bgnumber="" X trap "${SCRPDIR}/cleanup -l $LOGFILE -a; exit" 1 2 3 15 X if [ $runoption != 'Q' ] X then X echo "$bench: \c" X fi X echo "" >>$LOGFILE X ###################### select the bench specific values ########## X case $bench X in X dhry2) X options=${dhryloops-10000} X logmsg="Dhrystone 2 without register variables" X cleanopt="-d $tmp" X ;; X X dhry2reg) X options=${dhryloops-10000} X logmsg="Dhrystone 2 using register variables" X cleanopt="-d $tmp" X ;; X X arithoh|register|short|int|long) X options=${arithloop-10000} X logmsg="Arithmetic Test (type = $bench): $options Iterations" X ;; X X float|double) X options=${arithloop-10000} X logmsg="Arithmetic Test (type = $bench): $options Iterations" X ;; X X dc) need=dc.dat X prog=dc X options="" X stdin=dc.dat X stdout=/dev/null X logmsg="Arithmetic Test (sqrt(2) with dc to 99 decimal places)" X ;; X X hanoi) options='$param' X stdout=/dev/null X logmsg="Recursion Test: Tower of Hanoi Problem" X paramlist="${ndisk-17}" X parammsg='$param Disk Problem:' X ;; X X syscall) X options=${ncall-4000} X logmsg="System Call Overhead Test: 5 x $options Calls" X ;; X X context1) X options=${switch1-500} X logmsg="Pipe-based Context Switching Test: 2 x $options Switches" X ;; X X pipe) options=${io-2048} X logmsg="Pipe Throughput Test: read & write $options x 512 byte blocks" X ;; X X spawn) options=${children-100} X logmsg="Process Creation Test: $options forks" X ;; X X execl) options=${nexecs-100} X logmsg="Execl Throughput Test: $options execs" X ;; X X fstime) X where=${where-${TMPDIR}} X options='$param '"$where" X logmsg="Filesystem Throughput Test:" X paramlist=${seconds-"1 10 20"} X parammsg='Test Time: $param secs' X cleanopt="-f $tmp" X ;; X X C) need=cctest.c X prog=cc X options='$param' X stdout=/dev/null X repeat="$shortloop" X logmsg="C Compiler Test:" X paramlist="cctest.c" X parammsg='cc $param' X rm -f a.out X ;; Xdbmscli) X repeat="$shortloop" X need="db.dat" X # records queuespace X prepcmd='${BINDIR}/dbprep ${testdir}/db.dat 1000 1024' X paramlist=${clients-"1 2 4 8"} X parammsg='$param client processes.' X logmsg="Client/Server Database Engine:" X options='${testdir}/db.dat $param 0 1000' # $param clients; X # 0 sleep; 1000 iterations X ;; Xshell) X prog="multi.sh" X repeat="$shortloop" X logmsg="Bourne shell script and Unix utilities" X paramlist=${background-"1 2 4 8 "} X parammsg='$param concurrent background processes' X bgnumber='$param' X ;; X *) ${BINDIR}/cleanup -l $LOGFILE -r "run: unknown benchmark \"$bench\"" -a X exit 1 X ;; Xesac X################################################################ X###################### the main task ########################### X###################### run the bench ########################### X################################################################ X# each of those variables are now used in a general way X# Xecho "$break1" >>$LOGFILE # break between bench pgms Xecho "$logmsg" >>$LOGFILE # benchmark name X for param in $paramlist X do # level 2 X param=`echo $param | sed 's/_/ /g'` # be sure that spaces are used X # underscore can couple params X if [ "$runoption" != "Q" ] X then X echo "\n [$param] -\c" # generate message to user X fi X eval msg='"'$parammsg'"' # the eval is used to X echo "$break2" >>$LOGFILE # break between bench pgms X if test "$msg" # evaluate any embedded X then # variables in the parammsg X echo "$msg" >>$LOGFILE X fi X X eval opt='"'$options'"' # evaluate any vars in options X eval prep='"'$prepcmd'"' # evaluate any prep command X eval bg='"'$bgnumber'"' # evaluate bgnumber string X rm -f $tmp # remove any tmp files X X # if the test requires mulitple concurrent processes, X # prepare the background process string (bgstr) X # this is just a string of "+"s that will provides a X # parameter count for a "for" loop X bgstr="" X if test "$bg" != "" X then X count=`expr "$bg"` X while test $count -gt 0 X do X bgstr="+ $bgstr" X count=`expr $count - 1` X done X fi X # X for i in $repeat # loop for the specified number X do # do depth 3 X if [ "$runoption" != 'D' ] # level 1 X then X # regular Run - set logfile to go on signal X trap "${BINDIR}/cleanup -l $LOGFILE -i $i $cleanopt -a; exit" 1 2 3 15 X else X trap "exit" 1 2 3 15 X fi #end level 1 X if [ "$runoption" != 'Q' ] X then X echo " $i\c" # display repeat number X fi X pwd=`pwd` # remember where we are X cd $testdir # move to the test directory X if [ "$runoption" = "V" ] X then X echo X echo "BENCH COMMAND TO BE EXECUTED:" X echo "$prog $opt" X fi X X # execute any prepratory command string X if [ -n "$prep" ] X then X $prep 2>&1 >>$stdout X fi X ############ THE BENCH IS TIMED ############## X if test "$stdin" = "" X then # without redirected stdin X time $prog $opt $bgstr 2>>$tmp >>$stdout X else # with redirected stdin X time $prog $opt $bgstr <$stdin 2>>$tmp >>$stdout X fi X time $benchcmd X ############################################### X cd $pwd # move back home X status=$? # save the result code X if test $status != 0 # must have been an error X then X if test -f $tmp # is there an error file ? X then X cp $tmp ${TMPDIR}/save.$bench.$param X ${SCRPDIR}/cleanup -l $LOGFILE -i $i $cleanopt -r \ X "run: bench=$bench param=$param fatalstatus=$status" -a X else X ${SCRPDIR}/cleanup -l $LOGFILE -r \ X "run: bench=$bench param=$param fatalstatus=$status" -a X fi X exit # leave the script if there are errors X fi # end level 1 X done # end do depth 3 - repeat of bench X if [ "$runoption" != 'D' ] X then X ${SCRPDIR}/cleanup -l $LOGFILE $cleanopt # finalize this bench X # with these options X # & calculate results X fi X done # end do depth 2 - end of all options for this bench X X ########### some specific cleanup routines ############## X case $bench X in X C) X rm -f cctest.o a.out X ;; X X fstime) X sync; sleep 20 X ;; X esac X if [ "$runoption" != 'Q' ] X then X echo "" X fi Xdone # end do level 1 - all benchmarks requested X########## a few last items for the end ############## Xecho "" >>$LOGFILE Xecho " " `who | wc -l` "interactive users." >>$LOGFILE Xecho "End Benchmark Run ($date) ...." >>$LOGFILE Xif [ "$runoption" != 'Q' ] Xthen X pg $LOGFILE Xfi Xexit X########################### Amen ###################### END_OF_FILE echo shar: 1 control character may be missing from \"'Run'\" if test 13521 -ne `wc -c <'Run'`; then echo shar: \"'Run'\" unpacked with wrong size! fi chmod +x 'Run' # end of 'Run' fi if test -f 'dummy.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'dummy.c'\" else echo shar: Extracting \"'dummy.c'\" \(7461 characters\) sed "s/^X//" >'dummy.c' <<'END_OF_FILE' X X/******************************************************************************* X * The BYTE UNIX Benchmarks - Release 2 X * Module: dummy.c SID: 2.4 4/17/90 16:45:32 X * X ******************************************************************************* X * Bug reports, patches, comments, suggestions should be sent to: X * X * Ben Smith or Rick Grehan at BYTE Magazine X * bensmith@bixpb.UUCP rick_g@bixpb.UUCP X * X ******************************************************************************* X * Modification Log: X * X ******************************************************************************/ Xchar SCCSid[] = "@(#) @(#)dummy.c:2.4 -- 4/17/90 16:45:32"; X/* X * Hacked up C program for use in the standard shell.? scripts of X * the multiuser test. This is based upon makework.c, and is typically X * edited using edscript.2 before compilation. X * X * $Header: dummy.c,v 3.4 87/06/23 15:54:53 kjmcdonell Beta $ X */ X X#include <stdio.h> X#include <signal.h> X X#define DEF_RATE 5.0 X#define GRANULE 5 X#define CHUNK 60 X#define MAXCHILD 12 X#define MAXWORK 10 X Xfloat thres; Xfloat est_rate = DEF_RATE; Xint nusers; /* number of concurrent users to be simulated by X * this process */ Xint firstuser; /* ordinal identification of first user for this X * process */ Xint nwork = 0; /* number of job streams */ Xint exit_status = 0; /* returned to parent */ Xint sigpipe; /* pipe write error flag */ X Xstruct st_work { X char *cmd; /* name of command to run */ X char **av; /* arguments to command */ X char *input; /* standard input buffer */ X int inpsize; /* size of standard input buffer */ X} work[MAXWORK]; X Xstruct { X int xmit; /* # characters sent */ X char *bp; /* std input buffer pointer */ X int blen; /* std input buffer length */ X int fd; /* stdin to command */ X int pid; /* child PID */ X char *line; /* start of input line */ X int firstjob; /* inital piece of work */ X int thisjob; /* current piece of work */ X} child[MAXCHILD], *cp; X Xmain(argc, argv) Xint argc; Xchar *argv[]; X{ X int i; X int l; X int fcopy = 0; /* fd for copy output */ X int master = 1; /* the REAL master, == 0 for clones */ X int nchild; /* no. of children for a clone to run */ X int done; /* count of children finished */ X int output; /* aggregate output char count for all X children */ X int c; X int thiswork = 0; /* next job stream to allocate */ X int nch; /* # characters to write */ X int written; /* # characters actully written */ X char logname[15]; /* name of the log file(s) */ X int onalarm(); X int pipeerr(); X int wrapup(); X int grunt(); X char *malloc(); X int pvec[2]; /* for pipes */ X char *p; X char *prog; /* my name */ X X#if ! debug X freopen("masterlog.00", "a", stderr); X#endif X fprintf(stderr, "*** New Run *** "); X prog = argv[0]; X while (argc > 1 && argv[1][0] == '-') { X p = &argv[1][1]; X argc--; X argv++; X while (*p) { X switch (*p) { X case 'r': X /* code DELETED here */ X argc--; X argv++; X break; X X case 'c': X /* code DELETED here */ X lseek(fcopy, 0L, 2); /* append at end of file */ X break; X X default: X fprintf(stderr, "%s: bad flag '%c'\n", prog, *p); X exit(4); X } X p++; X } X } X X if (argc < 2) { X fprintf(stderr, "%s: missing nusers\n", prog); X exit(4); X } X X nusers = atoi(argv[1]); X if (nusers < 1) { X fprintf(stderr, "%s: impossible nusers (%d<-%s)\n", prog, nusers, argv[1]); X exit(4); X } X fprintf(stderr, "%d Users\n", nusers); X argc--; X argv++; X X /* build job streams */ X getwork(); X#if debug X dumpwork(); X#endif X X /* clone copies of myself to run up to MAXCHILD jobs each */ X firstuser = MAXCHILD; X fprintf(stderr, "master pid %d\n", getpid()); X fflush(stderr); X while (nusers > MAXCHILD) { X fflush(stderr); X if (nusers >= 2*MAXCHILD) X /* the next clone must run MAXCHILD jobs */ X nchild = MAXCHILD; X else X /* the next clone must run the leftover jobs */ X nchild = nusers - MAXCHILD; X if ((l = fork()) == -1) { X /* fork failed */ X fatal("** clone fork failed **\n"); X goto bepatient; X } else if (l > 0) { X fprintf(stderr, "master clone pid %d\n", l); X /* I am the master with nchild fewer jobs to run */ X nusers -= nchild; X firstuser += MAXCHILD; X continue; X } else { X /* I am a clone, run MAXCHILD jobs */ X#if ! debug X sprintf(logname, "masterlog.%02d", firstuser/MAXCHILD); X freopen(logname, "w", stderr); X#endif X master = 0; X nusers = nchild; X break; X } X } X if (master) X firstuser = 0; X X close(0); X X /* code DELETED here */ X X fflush(stderr); X X srand(time(0)); X thres = 0; X done = output = 0; X for (i = 0; i < nusers; i++) { X if (child[i].blen == 0) X done++; X else X thres += est_rate * GRANULE; X } X est_rate = thres; X X signal(SIGALRM, onalarm); X signal(SIGPIPE, pipeerr); X alarm(GRANULE); X while (done < nusers) { X for (i = 0; i < nusers; i++) { X cp = &child[i]; X if (cp->xmit >= cp->blen) continue; X l = rand() % CHUNK + 1; /* 1-CHUNK chars */ X if (l == 0) continue; X if (cp->xmit + l > cp->blen) X l = cp->blen - cp->xmit; X p = cp->bp; X cp->bp += l; X cp->xmit += l; X#if debug X fprintf(stderr, "child %d, %d processed, %d to go\n", i, cp->xmit, cp->blen - cp->xmit); X#endif X while (p < cp->bp) { X if (*p == '\n' || (p == &cp->bp[-1] && cp->xmit >= cp->blen)) { X /* write it out */ X nch = p - cp->line + 1; X if ((written = write(cp->fd, cp->line, nch)) != nch) { X X /* code DELETED here */ X X } X if (fcopy) X write(fcopy, cp->line, p - cp->line + 1); X#if debug X fprintf(stderr, "child %d gets \"", i); X { X char *q = cp->line; X while (q <= p) { X if (*q >= ' ' && *q <= '~') X fputc(*q, stderr); X else X fprintf(stderr, "\\%03o", *q); X q++; X } X } X fputc('"', stderr); X#endif X cp->line = &p[1]; X } X p++; X } X if (cp->xmit >= cp->blen) { X done++; X close(cp->fd); X#if debug X fprintf(stderr, "child %d, close std input\n", i); X#endif X } X output += l; X } X while (output > thres) { X pause(); X#if debug X fprintf(stderr, "after pause: output, thres, done %d %.2f %d\n", output, thres, done); X#endif X } X } X Xbepatient: X alarm(0); X/**** X * If everything is going OK, we should simply be able to keep X * looping unitil 'wait' fails, however some descendent process may X * be in a state from which it can never exit, and so a timeout X * is used. X * 5 minutes should be ample, since the time to run all jobs is of X * the order of 5-10 minutes, however some machines are painfully slow, X * so the timeout has been set at 20 minutes (1200 seconds). X ****/ X X /* code DELETED here */ X X} X Xonalarm() X{ X thres += est_rate; X signal(SIGALRM, onalarm); X alarm(GRANULE); X} X Xgrunt() X{ X /* timeout after label "bepatient" in main */ X exit_status = 4; X wrapup(); X} X Xpipeerr() X{ X sigpipe++; X} X Xwrapup() X{ X /* DUMMY, real code dropped */ X} X Xgetwork() X{ X X /* DUMMY, real code dropped */ X gets(); X strncpy(); X malloc(); realloc(); X open(); close(); X} X Xfatal(s) Xchar *s; X{ X int i; X fprintf(stderr, s); X fflush(stderr); X perror("Reason?"); X for (i = 0; i < nusers; i++) { X if (child[i].pid > 0 && kill(child[i].pid, SIGKILL) != -1) X fprintf(stderr, "pid %d killed off\n", child[i].pid); X } X fflush(stderr); X exit_status = 4; X return; X} END_OF_FILE if test 7461 -ne `wc -c <'dummy.c'`; then echo shar: \"'dummy.c'\" unpacked with wrong size! fi chmod +x 'dummy.c' # end of 'dummy.c' fi if test -f 'fstime.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'fstime.c'\" else echo shar: Extracting \"'fstime.c'\" \(4801 characters\) sed "s/^X//" >'fstime.c' <<'END_OF_FILE' X/******************************************************************************* X * The BYTE UNIX Benchmarks - Release 2 X * Module: fstime.c SID: 2.8 4/17/90 16:45:33 X * X ******************************************************************************* X * Bug reports, patches, comments, suggestions should be sent to: X * X * Ben Smith or Rick Grehan at BYTE Magazine X * bensmith@bixpb.UUCP rick_g@bixpb.UUCP X * X ******************************************************************************* X * Modification Log: X * $Header: fstime.c,v 3.4 87/06/22 14:23:05 kjmcdonell Beta $ X * 10/19/89 - rewrote timing calcs and added clock check (Ben Smith) X * 10/26/89 - simplify timing, change defaults (Tom Yager) X * 11/16/89 - added better error handling and changed output format (Ben Smith) X * 11/17/89 - changed the whole thing around (Ben Smith) X ******************************************************************************/ Xchar SCCSid[] = "@(#) @(#)fstime.c:2.8 -- 4/17/90 16:45:33"; X X#include <stdio.h> X#include <signal.h> X#include <errno.h> X X#define SECONDS 10 X#define BUFF_SIZE 1024 X X/****************** GLOBALS ***************************/ Xchar buf[BUFF_SIZE]; Xint seconds = SECONDS; Xint f; Xint g; Xint i; Xint stop_count(); Xint clean_up(); Xint sigalarm = 0; X X/******************** MAIN ****************************/ X Xmain(argc, argv) Xchar **argv; X{ X X/**** initialize ****/ X if (argc > 1) X seconds = atoi(argv[1]); X if (argc == 3 && chdir(argv[2]) == -1) X { X perror("fstime: chdir"); X exit(1); X } X if((f = creat("dummy0", 0600)) != -1) X close(f); X else X { X perror("fstime: creat"); X exit(1); X } X if((g = creat("dummy1", 0600)) != -1) X close(g); X else X { X perror("fstime: creat"); X exit(1); X } X if((f = open("dummy0", 2)) == -1) X { X perror("fstime: open"); X exit(1); X } X if((g = open("dummy1", 2)) == -1) X { X perror("fstime: open"); X exit(1); X } X /* fill buffer */ X for (i = 0; i < BUFF_SIZE; i++) X buf[i] = i & 0177; X /*** run the tests ****/ X signal(SIGKILL,clean_up); X if(w_test()) X { X clean_up(); X exit(1); X } X if(r_test()) X { X clean_up(); X exit(1); X } X if(c_test()) X { X clean_up(); X exit(1); X } X clean_up(); X exit(0); X} X Xw_test() X/* write test */ X{ X long n_blocks = 0L; X extern int sigalarm; X X sync(); X sleep(5); /* to insure the sync */ X X signal(SIGALRM,stop_count); X sigalarm = 0; /* reset alarm flag */ X alarm(seconds); X while(!sigalarm) X { X if (write(f, buf, BUFF_SIZE) <= 0) X { X if (errno != EINTR) { X perror("fstime: write"); X return(-1); X } else stop_count(); X } X ++ n_blocks; X } X /* stop clock */ X fprintf(stderr, "%ld Kbytes/sec write (%d second sample)\n", X (long) n_blocks / (long) seconds, seconds); Xreturn(0); X} X Xr_test() X/* read test */ X{ X long n_blocks = 0L; X extern int sigalarm; X extern int errno; X X /* rewind */ X sync(); X sleep(5); X lseek(f, 0L, 0); X X signal(SIGALRM,stop_count); X sigalarm = 0; /* reset alarm flag */ X alarm(seconds); X while(!sigalarm) X { X if (read(f, buf, BUFF_SIZE) <= 0) X { X if (errno == EINVAL) { X lseek(f, 0L, 0); /* rewind at end of file */ X } else { X if (errno != EINTR) { X perror("fstime: read"); X return(-1); X } else stop_count(); X } X } X ++ n_blocks; X } X /* stop clock */ X fprintf(stderr, "%ld Kbytes/sec read (%d second sample)\n", X (long) n_blocks / (long) seconds, seconds); Xreturn(0); X} X X Xc_test() X/* copy test */ X{ X long n_blocks = 0L; X extern int sigalarm; X X /* rewind */ X sync(); X sleep(5); /* to insure the sync */ X lseek(f, 0L, 0); X X signal(SIGALRM,stop_count); X sigalarm = 0; /* reset alarm flag */ X alarm(seconds); X while(!sigalarm) X { X if (read(f, buf, BUFF_SIZE) <= 0) X { X if (errno == EINVAL) { X lseek(f, 0L, 0); /* rewind at end of file */ X } else { X if (errno != EINTR) { X perror("fstime: read"); X return(-1); X } else stop_count(); X } X } X if (write(g, buf, BUFF_SIZE) <= 0) X { X if (errno != EINTR) { X perror("fstime: write in copy"); X return(-1); X } else stop_count(); X } X ++ n_blocks; X } X /* stop clock */ X fprintf(stderr, "%ld Kbytes/sec copy (%d second sample)\n", X (long) n_blocks / (long) seconds, seconds); Xreturn(0); X} X Xstop_count() X{ Xextern int sigalarm; Xsigalarm = 1; Xreturn(0); X} X Xclean_up() X{ Xunlink(f); Xunlink(g); Xreturn(0); X} END_OF_FILE if test 4801 -ne `wc -c <'fstime.c'`; then echo shar: \"'fstime.c'\" unpacked with wrong size! fi chmod +x 'fstime.c' # end of 'fstime.c' fi if test -f 'precision.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'precision.c'\" else echo shar: Extracting \"'precision.c'\" \(5691 characters\) sed "s/^X//" >'precision.c' <<'END_OF_FILE' X/******************************************************************************* X * The BYTE UNIX Benchmarks - Release 2 X * Module: precision.c SID: 2.4 4/17/90 16:45:35 X * X ******************************************************************************* X * Bug reports, patches, comments, suggestions should be sent to: X * X * Ben Smith or Rick Grehan at BYTE Magazine X * bensmith@bixpb.UUCP rick_g@bixpb.UUCP X * X ******************************************************************************* X * Modification Log: X * $Header: precision.c,v 3.5 87/08/06 08:10:59 kenj Exp $ X * X ******************************************************************************/ Xchar SCCSid[] = "@(#) @(#)precision.c:2.4 -- 4/17/90 16:45:35"; X/* Program to determine properties of the arithmetic available. */ X/* Makes certain assumptions about the likely format of numbers */ X/* */ X/* Author: Steven Pemberton, CWI, Amsterdam. steven@mcvax */ X/* */ X/* If your C system is not unix but does have signal/setjmp, */ X/* add a #define unix */ X/* You may also need to change the #include <sys/signal.h> line */ X/* and add some calls to signal(). */ X/* X */ X X#ifdef unix X X#define SIGNAL X X#include <sys/signal.h> X#include <setjmp.h> X Xjmp_buf lab; Xoverflow(sig) int sig; { /*what to do on overflow*/ X signal(sig, overflow); X longjmp(lab, 1); X} X X#endif X Xint tenlog(v) double v; { X /*The largest power of ten less than v*/ X int p=0; X while (v>10) { p++; v/=10; } X return p; X} X Xint two(v) int v; { X /* (the closest power of two to v)-1 */ X int t=1, s; X while (t<v) t=t*2+1; X s=(t-1)/2; X if ((v-s)>(t-v)) return(t); X return(s); X} X Xdouble twopower(n, e) int n, *e; { X /* Calculate 2**n without overflow worries */ X /* Result is r*10**e */ X double r=1.0; *e=0; X while (n-- > 0) { X r*=2.0; X if (r>10.0) { r/=10.0; (*e)++; } X } X return(r); X} X Xmain() { X short maxshort, newshort; X int maxint, newint, i, maxfexp, maxdexp, bits, X fmantis, dmantis, ddmantis, X shortpower, intpower, longpower, X fpower, dpower, fipower, dipower, ddipower, lpower, base; X long maxlong, newlong; X float maxfloat, newfloat, sum, f, maxifloat; X double maxdouble, newdouble, maxidouble, maxiexpr, X d, incr, dsum; X X#ifdef SIGNAL X signal(SIGFPE, overflow); /*signal(SIGOVER, overflow);*/ X#endif X X/****** Calculate max short *********************************************/ X/* Calculate 2**n-1 until overflow - then use the previous value */ X X newshort=1; maxshort=0; X#ifdef SIGNAL X if (setjmp(lab)==0) X#endif X for(shortpower=0; newshort>maxshort; shortpower++) { X maxshort=newshort; X newshort=newshort*2+1; X } X bits= (shortpower+1)/sizeof(short); X printf("maxshort=%d (=2**%d-1)\n", maxshort, shortpower); X X/****** Calculate max int by the same method ***************************/ X X newint=1; maxint=0; X#ifdef SIGNAL X if (setjmp(lab)==0) X#endif X for(intpower=0; newint>maxint; intpower++) { X maxint=newint; X newint=newint*2+1; X } X printf("maxint=%d (=2**%d-1)\n", maxint, intpower); X X/****** Calculate max long by the same method ***************************/ X X newlong=1; maxlong=0; X#ifdef SIGNAL X if (setjmp(lab)==0) X#endif X for(longpower=0; newlong>maxlong; longpower++) { X maxlong=newlong; X newlong=newlong*2+1; X } X printf("maxlong=%ld (=2**%d-1)\n", maxlong, longpower); X X/****** Calculate max float, assuming it's a power of two ***************/ X/* Calculate 2**i until it overflows, and then use the nearest */ X/* power of two (some machines overflow early, some late) */ X X newfloat=1; maxfloat=0; X#ifdef SIGNAL X if (setjmp(lab)==0) X#endif X for(i=0;newfloat>maxfloat;i++) { X maxfloat=newfloat; X newfloat=newfloat*2; X } X maxfexp=two(i); maxfloat=twopower(maxfexp, &fpower); X printf("maxfloat=~%fE%d (=~2**%d) (%d bits)\n", X maxfloat, fpower, maxfexp, sizeof(float)*bits); X X/****** Calculate max double, assuming it's a power of two **************/ X X newdouble=1; maxdouble=0; X#ifdef SIGNAL X if (setjmp(lab)==0) X#endif X for(i=0;newdouble>maxdouble;i++) { X maxdouble=newdouble; X newdouble*=2; X } X#ifdef SIGNAL X if (setjmp(lab)!=0) { printf("\nUnexpected overflow\n"); exit(1); } X#endif X maxdexp=two(i); maxdouble=twopower(maxdexp, &dpower); X printf("maxdouble=~%fE%d (=~2**%d) (%d bits)\n", X maxdouble, dpower, maxdexp, sizeof(double)*bits); X X/****** Calculate the accuracy for float, double, and expressions *******/ X/* maxintfloat and maxintdouble are the largest values that can */ X/* still be integer values; ie such that (x+1)-x=1. */ X/* Some systems really do use extra precision in expressions */ X X f=2.0; incr=1.0; sum=f+incr; X for (fmantis=0; sum>2.0; fmantis++) { incr/=2; sum=f+incr; } X printf("max float exp=%d mantissa bits=%d\n", maxfexp, fmantis); X X d=2.0; incr=1.0; dsum=d+incr; X for (dmantis=0; dsum>2.0; dmantis++) { incr/=2; dsum=d+incr; } X printf("max double exp=%d mantissa bits=%d\n", maxdexp, dmantis); X X d=2.0; incr=1.0; X for (ddmantis=0; d+incr>2.0; ddmantis++) incr/=2; X X maxifloat=twopower(fmantis, &fipower); X printf("maxintfloat=~%fE%d (=2**%d-1) (%d digit precision)\n", X maxifloat, fipower, fmantis, fipower); X X maxidouble=twopower(dmantis, &dipower); X printf("maxintdouble=~%fE%d (=2**%d-1) (%d digit precision)\n", X maxidouble, dipower, dmantis, dipower); X X maxiexpr=twopower(ddmantis, &ddipower); X printf("maxint for expressions=~%fE%d (=2**%d-1) (%d digit precision)\n", X maxiexpr, ddipower, ddmantis, ddipower); X X/****** BASE is the largest power of ten such that BASE*BASE can be */ X/* computed exactly as a double, and BASE+BASE as a long, useful */ X/* for multi-length arithmetic */ X X lpower= tenlog((double)(maxlong/2)); X base= (dipower/2)>lpower?lpower:(dipower/2); X printf("BASE=1E%d\n", base); X X exit(0); X} END_OF_FILE if test 5691 -ne `wc -c <'precision.c'`; then echo shar: \"'precision.c'\" unpacked with wrong size! fi chmod +x 'precision.c' # end of 'precision.c' fi if test -f 'sort.src' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'sort.src'\" else echo shar: Extracting \"'sort.src'\" \(8555 characters\) sed "s/^X//" >'sort.src' <<'END_OF_FILE' Xversion="1.2" Xumask 022 # at least mortals can read root's files this way XPWD=`pwd` XHOMEDIR=${HOMEDIR:-.} Xcd $HOMEDIR XHOMEDIR=`pwd` Xcd $PWD XBINDIR=${BINDIR:-${HOMEDIR}/pgms} Xcd $BINDIR XBINDIR=`pwd` Xcd $PWD XPATH="${PATH}:${BINDIR}" XSCRPDIR=${SCRPDIR:-${HOMEDIR}/pgms} Xcd $SCRPDIR XSCRPDIR=`pwd` Xcd $PWD XTMPDIR=${HOMEDIR}/tmp Xcd $TMPDIR XTMPDIR=`pwd` Xcd $PWD XRESULTDIR=${RESULTDIR:-${HOMEDIR}/results} Xcd $RESULTDIR XRESULTDIR=`pwd` Xcd $PWD XTESTDIR=${TESTDIR:-${HOMEDIR}/testdir} Xcd $TESTDIR XTESTDIR=`pwd` Xcd $PWD Xexport BINDIR TMPDIR RESULTDIR PATH Xbell="" Xecho "kill -9 $$" > ${TMPDIR}/kill_run ; chmod u+x ${TMPDIR}/kill_run Xarithmetic="arithoh register short int long float double dc" Xsystem="syscall pipe context1 spawn execl fstime" Xmem="seqmem randmem" Xmisc="C shell" Xdhry="dhry2 dhry2reg" # dhrystone loops Xdb="dbmscli" # add to as new database engines are developed Xload="shell" # cummulative load tests Xargs="" # the accumulator for the bench units to be run Xrunoption="N" Xfor word Xdo # do level 1 Xcase $word Xin Xall) X;; Xarithmetic) Xargs="$args $arithmetic" X;; Xdb) Xargs="$args $db" X;; Xdhry) Xargs="$args $dhry" X;; Xload) Xargs="$args $load" X;; Xmem) Xargs="$args $mem" X;; Xmisc) Xargs="$args $misc" X;; Xspeed) Xargs="$args $arithmetic $system" X;; Xsystem) Xargs="$args $system" X;; X-q|-Q) Xrunoption="Q" #quiet X;; X-v|-V) Xrunoption="V" #verbose X;; X-d|-D) Xrunoption="D" #debug X;; X*) Xargs="$args $word" X;; Xesac Xdone # end do level 1 Xset - $args Xif test $# -eq 0 #no arguments specified Xthen Xset - $dhry $arithmetic $system $misc # db and work not included Xfi Xif test "$runoption" = 'D' Xthen Xset -x Xset -v Xfi Xdate=`date` Xtmp=${TMPDIR}/$$.tmp XLOGFILE=${RESULTDIR}/log Xif test -w ${RESULTDIR}/log Xthen Xif test -w ${RESULTDIR}/log.accum Xthen Xcat ${RESULTDIR}/log >> ${RESULTDIR}/log.accum Xrm ${RESULTDIR}/log Xelse Xmv ${RESULTDIR}/log ${RESULTDIR}/log.accum Xfi Xecho "Start Benchmark Run (BYTE Version $version)" >>$LOGFILE Xecho " $date (long iterations $iter times)" >>$LOGFILE Xecho " " `who | wc -l` "interactive users." >>$LOGFILE Xuname -a >>$LOGFILE Xiter=${iterations-6} Xif test $iter -eq 6 Xthen Xlongloop="1 2 3 4 5 6" Xshortloop="1 2 3" Xelse # generate list of loop numbers Xshort=`expr \( $iter + 1 \) / 2` Xlongloop="" Xshortloop="" Xwhile test $iter -gt 0 Xdo # do level 1 Xlongloop="$iter $longloop" Xif test $iter -le $short Xthen Xshortloop="$iter $shortloop" Xfi Xiter=`expr $iter - 1` Xdone # end do level 1 Xfi #loop list genration Xfor bench # line argument processing Xdo # do level 1 X# set some default values Xprog=${BINDIR}/$bench # the bench name is default program Xneed=$prog # we need the at least the program Xparamlist="#" # a dummy parameter to make anything run Xtestdir="${TESTDIR}" # the directory in which to run the test Xprepcmd="" # preparation command or script Xparammsg="" Xrepeat="$longloop" Xstdout="$LOGFILE" Xstdin="" Xcleanopt="-t $tmp" Xbgnumber="" Xtrap "${SCRPDIR}/cleanup -l $LOGFILE -a; exit" 1 2 3 15 Xif [ $runoption != 'Q' ] Xthen Xecho "$bench: \c" Xfi Xecho "" >>$LOGFILE X###################### select the bench specific values ########## Xcase $bench Xin Xdhry2) Xoptions=${dhryloops-10000} Xlogmsg="Dhrystone 2 without register variables" Xcleanopt="-d $tmp" X;; Xdhry2reg) Xoptions=${dhryloops-10000} Xlogmsg="Dhrystone 2 using register variables" Xcleanopt="-d $tmp" X;; Xarithoh|register|short|int|long|float|double) Xoptions=${arithloop-10000} Xlogmsg="Arithmetic Test (type = $bench): $options Iterations" X;; Xdc) need=dc.dat Xprog=dc Xoptions="" Xstdin=dc.dat Xstdout=/dev/null Xlogmsg="Arithmetic Test (sqrt(2) with dc to 99 decimal places)" X;; Xhanoi) options='$param' Xstdout=/dev/null Xlogmsg="Recursion Test: Tower of Hanoi Problem" Xparamlist="${ndisk-17}" Xparammsg='$param Disk Problem:' X;; Xsyscall) Xoptions=${ncall-4000} Xlogmsg="System Call Overhead Test: 5 x $options Calls" X;; Xcontext1) Xoptions=${switch1-500} Xlogmsg="Pipe-based Context Switching Test: 2 x $options Switches" X;; Xpipe) options=${io-2048} Xlogmsg="Pipe Throughput Test: read & write $options x 512 byte blocks" X;; Xspawn) options=${children-100} Xlogmsg="Process Creation Test: $options forks" X;; Xexecl) options=${nexecs-100} Xlogmsg="Execl Throughput Test: $options execs" X;; Xrandmem|seqmem) Xif test $bench = seqmem Xthen Xtype=Sequential Xelse Xtype=Random Xfi Xpoke=${poke-1000000} Xoptions='-s$param '"-n$poke" Xlogmsg="$type Memory Access Test: $poke Accesses" Xparamlist=${arrays-"512 1024 2048 8192 16384"} Xparammsg='Array Size: $param bytes' Xcleanopt="-m $tmp" X;; Xfstime) repeat="$shortloop" Xwhere=${where-${TMPDIR}} Xoptions='$param '"$where" Xlogmsg="Filesystem Throughput Test:" Xparamlist=${blocks-"512 1024 2048 8192"} Xparammsg='File Size: $param blocks' Xcleanopt="-f $tmp" X;; XC) need=cctest.c Xprog=cc Xoptions='$param' Xstdout=/dev/null Xrepeat="$shortloop" Xlogmsg="C Compiler Test:" Xparamlist="cctest.c" Xparammsg='cc $param' Xrm -f a.out X;; Xdbmscli) Xrepeat="$shortloop" Xneed="db.dat" Xprepcmd='${BINDIR}/dbprep ${testdir}/db.dat 10000' Xparamlist=${clients-"1 2 4 8"} Xparammsg='$param client processes. (filesize `cat ${testdir}/db.dat|wc -c` bytes)' Xlogmsg="Client/Server Database Engine:" Xoptions='${testdir}/db.dat $param 0 1000' # $param clients; X# 0 sleep; 1000 iterations X;; Xshell) Xprog="multi.sh" Xrepeat="$shortloop" Xlogmsg="Bourne shell script and Unix utilities" Xparamlist=${background-"1 2 4 8"} Xparammsg='$param concurrent background processes' Xbgnumber='$param' Xtestdir="shelldir" X;; X*) ${BINDIR}/cleanup -l $LOGFILE -r "run: unknown benchmark \"$bench\"" -a Xexit 1 X;; Xesac Xecho "$logmsg" >>$LOGFILE Xfor param in $paramlist Xdo # level 2 Xparam=`echo $param | sed 's/_/ /g'` # be sure that spaces are used X# underscore can couple params Xif [ "$runoption" != "Q" ] Xthen Xecho "\n [$param] -\c" # generate message to user Xfi Xeval msg='"'$parammsg'"' # the eval is used to Xif test "$msg" # evaluate any embedded Xthen # variables in the parammsg Xecho "" >>$LOGFILE Xecho "$msg" >>$LOGFILE Xfi Xeval opt='"'$options'"' # evaluate any vars in options Xeval prep='"'$prepcmd'"' # evaluate any prep command Xeval bg='"'$bgnumber'"' # evaluate bgnumber string Xrm -f $tmp # remove any tmp files X# if the test requires mulitple concurrent processes, X# prepare the background process string (bgstr) X# this is just a string of "+"s that will provides a X# parameter count for a "for" loop Xbgstr="" Xif test "$bg" != "" Xthen Xcount=`expr "$bg"` Xwhile test $count -gt 0 Xdo Xbgstr="+ $bgstr" Xcount=`expr $count - 1` Xdone Xfi X# Xfor i in $repeat # loop for the specified number Xdo # do depth 3 Xif [ "$runoption" != 'D' ] # level 1 Xthen X# regular Run - set logfile to go on signal Xtrap "${SCRPDIR}/cleanup -l $LOGFILE -i $i $cleanopt -a; exit" 1 2 3 15 Xelse Xtrap "exit" 1 2 3 15 Xfi #end level 1 Xif [ "$runoption" != 'Q' ] Xthen Xecho " $i\c" # display repeat number Xfi Xpwd=`pwd` # remember where we are Xcd $testdir # move to the test directory Xif [ "$runoption" = "V" ] Xthen Xecho Xecho "BENCH COMMAND TO BE EXECUTED:" Xecho "$prog $opt" Xfi X# execute any prepratory command string Xif [ -n "$prep" ] Xthen X$prep >>$stdout Xfi X############ THE BENCH IS TIMED ############## Xif test "$stdin" = "" Xthen # without redirected stdin Xtime $prog $opt $bgstr 2>>$tmp >>$stdout Xelse # with redirected stdin Xtime $prog $opt $bgstr <$stdin 2>>$tmp >>$stdout Xfi Xtime $benchcmd X############################################### Xcd $pwd # move back home Xstatus=$? # save the result code Xif test $status != 0 # must have been an error Xthen Xif test -f $tmp # is there an error file ? Xthen Xcp $tmp ${TMPDIR}/save.$bench.$param X${SCRPDIR}/cleanup -l $LOGFILE -i $i $cleanopt -r \ X"run: bench=$bench param=$param fatalstatus=$status" -a Xelse X${SCRPDIR}/cleanup -l $LOGFILE -r \ X"run: bench=$bench param=$param fatalstatus=$status" -a Xfi Xexit # leave the script if there are errors Xfi # end level 1 Xdone # end do depth 3 - repeat of bench Xif [ "$runoption" != 'D' ] Xthen X${SCRPDIR}/cleanup -l $LOGFILE $cleanopt # finalize this bench X# with these options X# & calculate results Xfi Xdone # end do depth 2 - end of all options for this bench X########### some specific cleanup routines ############## Xcase $bench Xin XC) Xrm -f cctest.o a.out X;; Xesac Xif [ "$runoption" != 'Q' ] Xthen Xecho "" Xfi Xdone # end do level 1 - all benchmarks requested Xecho "" >>$LOGFILE Xecho " " `who | wc -l` "interactive users." >>$LOGFILE Xecho "End Benchmark Run ($date) ...." >>$LOGFILE Xif [ "$runoption" != 'Q' ] Xthen Xpg $LOGFILE Xfi Xexit END_OF_FILE echo shar: 1 control character may be missing from \"'sort.src'\" if test 8555 -ne `wc -c <'sort.src'`; then echo shar: \"'sort.src'\" unpacked with wrong size! fi chmod +x 'sort.src' # end of 'sort.src' fi echo shar: End of archive 2 \(of 5\). cp /dev/null ark2isdone MISSING="" for I in 1 2 3 4 5 ; do if test ! -f ark${I}isdone ; then MISSING="${MISSING} ${I}" fi done if test "${MISSING}" = "" ; then echo You have unpacked all 5 archives. rm -f ark[1-9]isdone else echo You still need to unpack the following archives: echo " " ${MISSING} fi ## End of shell archive. exit 0 exit 0 # Just in case... -- Please send comp.sources.unix-related mail to rsalz@uunet.uu.net. Use a domain-based address or give alternate paths, or you may lose out.