v22i029: Byte Unix benchmarks, Part02/05
Rich Salz
rsalz at uunet.uu.net
Tue May 8 23:03:03 AEST 1990
Submitted-by: "Ben Smith @ BYTE" <ben at 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 at 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 at bytepb.UUCP rick_g at 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 at bytepb.UUCP rick_g at bytepb.UUCP tyager at 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 at bixpb.UUCP rick_g at 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 at bixpb.UUCP rick_g at 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 at bixpb.UUCP rick_g at 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 at 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 at uunet.uu.net.
Use a domain-based address or give alternate paths, or you may lose out.
More information about the Comp.sources.unix
mailing list