Dhrystone (+other) Benchmark
Rick Richardson
gemini at homxb.UUCP
Sun Dec 15 00:18:16 AEST 1985
echo shar: extracting makefile;
sed 's/^X//' <<'SHAR_EOF' >makefile
X#
X# This makefile builds several benchmarks for UNIX
X#
X# The BYTE magazine benchmarks are here, as well as iocall,
X# which came off Usenet, and Dhrystone.
X#
X# type: make #to build all the programs
X# make run #to run all of the benchmarks
X#
X# make run >results 2>&1
X# make report #Generates handy summary
X#
X# collected by Rick Richardson, PC Research, Inc. (201) 922-1134
X# ..!ihnp4!houxm!castor!pcrat!rer
X# NOTE: send me the Dhrystone benchmarks results for any new machine
X# I'll summarize for the next release of dhrystone.
X#
XSHELL=/bin/sh
XFILES= makefile dry.README\
X dread.c fcall.c float.c iocall.c loop.c pipes.c sieve.c \
X tst.sh dwrite.c fibo.c iofile.c multi.sh scall.c bytesort.c \
X dry.c dryresults.sh gen_rpt
XBYTE= dwrite dread fcalla fcalle fibo float iofile loop pipes scall \
X sieve bytesort
XUSENET= iocall
XDRY= dryr drynr
XCMDS= $(BYTE) $(USENET) $(DRY)
X#
X# -z/-i flags are recommended for Venix
X#
XCFLAGS=-O -s
X#CFLAGS=-O -s -i -z
X
Xall: $(BYTE) $(USENET) $(DRY)
X
Xclobber:
X -rm -f $(BYTE) $(USENET) $(DRY)
X
Xbench.shar: $(FILES)
X shar $(FILES) > $@
Xfcalle: fcall.c
X cc $(CFLAGS) -DEMPTY fcall.c -o $@
Xfcalla: fcall.c
X cc $(CFLAGS) -DASSIGN fcall.c -o $@
Xbytesort: bytesort.c
X cc -s -O -i bytesort.c -o $@
Xdryr: dry.c
X cc $(CFLAGS) -DREG=register dry.c -o $@
Xdrynr: dry.c
X cc $(CFLAGS) dry.c -o $@
X
Xrun: shells
X for i in $(CMDS); do echo "$$i:"; time $$i; done
X @rm -f rfile
X
Xreport: results
X gen_rpt results report
X
Xshells:
X time $(SHELL) tst.sh
X time $(SHELL) multi.sh 1
X time $(SHELL) multi.sh 1 2
X time $(SHELL) multi.sh 1 2 3
X time $(SHELL) multi.sh 1 2 3 4
X time $(SHELL) multi.sh 1 2 3 4 5
SHAR_EOF
echo shar: extracting dry.README;
sed 's/^X//' <<'SHAR_EOF' >dry.README
XANNOUNCMENT
XAttached, please find the 11/08/85 list of DHRYSTONE benchmark results.
XThe source code for the drystone benchmark can be found in net.sources.
X
XThe latest list includes many new machines/compiler combinations. Many
Xof the questionable results have been confirmed or corrected. I am still
Xwaiting for Intel 386 results; I'm sure many others are, too.
X
XCLARIFICATION
XThere seems to have been a great deal of confusion over what this
Xbenchmark measures, and how to use these results. Let me try to clarify
Xthis:
X
X 1) DHRYSTONE is a measure of processor+compiler efficiency in
X executing a 'typical' program. The 'typical' program was
X designed by measuring statistics on a great number of
X 'real' programs. The 'typical' program was then written
X by Reinhold P. Weicker using these statistics. The
X program is balanced according to statement type, as well
X as data type.
X
X 2) DHRYSTONE does not use floating point. Typical programs don't.
X
X 3) DHRYSTONE does not do I/O. Typical programs do, but then
X we'd have a whole can of worms opened up.
X
X 4) DHRYSTONE does not contain much code that can be optimized
X by vector processors. That's why a CRAY doesn't look real
X fast, they weren't built to do this sort of computing.
X
X 5) DHRYSTONE does not measure OS performance, as it avoids
X calling the O.S. The O.S. is indicated in the results only
X to help in identifying the compiler technology.
X
XIf somebody asked me to pick out the best machine for the money, I
Xwouldn't look at just the results of DHRYSTONE. I'd probably:
X
X 1) Run DHRYSTONE to get a feel for the compiler+processor
X speed.
X 2) Run any number of benchmarks to check disk I/O bandwidth,
X using both sequential and random read/writes.
X 3) Run a multitasking benchmark to check multi-user response
X time. Typically, these benchmarks run several types of
X programs such as editors, shell scripts, sorts, compiles,
X and plot the results against the number of simulated users.
X 4) If appropriate for the intended use, run WHETSTONE, to determine
X floating point performance.
X 5) If appropriate for intended use, run some programs which do
X vector and matrix computations.
X 6) Figure out what the box will:
X - cost to buy
X - cost to operate and maintain
X - be worth when it is sold
X - be worth if the manufacturer goes out of business
X 7) Having done the above, I probably have a hand-full of
X machines which meet my price/performance requirements.
X Now, I find out if the applications programs I'd like
X to use will run on any of these machines. I also find
X out how much interest people have in writing new software
X for the machine, and look carefully at the migration path
X I will have to take when I reach the limits of the machine.
X
XTo summarize, DHRYSTONES by themselves are not anything more than
Xa way to win free beers when arguing 'Box-A versus Box-B' religion.
XThey do provide insight into Box-A/Compiler-A versus Box-A/Compiler-B
Xcomparisons.
X
XAs usual, all comments and new results should be mailed directly
Xto me at ..{ihnp4,..others..}!houxm!castor!rer. I will summarize
Xand post to the net.
X
XRick Richardson
XPC Research, Inc.
X(201) 834-1378
X..!houxm!castor!rer
SHAR_EOF
echo shar: extracting dread.c;
sed 's/^X//' <<'SHAR_EOF' >dread.c
X#include <stdio.h>
X#define BLOCKS 256
Xlong lseek();
X
Xmain()
X{
X char buffer[512];
X char *filename = "a_large_file";
X register int i;
X int fildes;
X long int offset;
X if ((fildes = open(filename, 0)) < 0) {
X printf("Cannot find '%s'. Run 'dwrite' first.\n", filename);
X exit(1);
X }
X for (i = 0; i < BLOCKS; ++i)
X {
X#ifdef SIXTEEN
X offset = (long) rand() * 4L;
X#endif
X#ifdef THIRTYTWO
X offset = (long) rand() / 16384L;
X#endif
X if (lseek(fildes, offset, 0) < 0) {
X printf("Lseek to %ld failed i=%d\n", offset, i);
X exit (1);
X }
X if (read(fildes, buffer, 512) < 0) {
X printf("Error reading block at byte %ld\n", offset);
X exit (1);
X }
X }
X unlink(filename);
X exit(0);
X}
SHAR_EOF
echo shar: extracting fcall.c;
sed 's/^X//' <<'SHAR_EOF' >fcall.c
X#define TIMES 50000
Xmain()
X#ifdef EMPTY
X{
X register unsigned int i,j;
X for (i = 0; i < TIMES; ++i)
X j = empty(i);
X exit(0);
X}
Xempty(k)
Xregister unsigned int k;
X{
X return (k);
X}
X#endif
X#ifdef ASSIGN
X{
X register unsigned int i,j;
X for (i = 0; i < TIMES; ++i)
X j = i;
X exit(0);
X}
X#endif
SHAR_EOF
echo shar: extracting float.c;
sed 's/^X//' <<'SHAR_EOF' >float.c
X#define CONST1 3.141597E0
X#define CONST2 1.7839032E4
X#define COUNT 10000
X#define REG
X
Xmain()
X{
X double a, b, c;
X REG int i;
X
X a = CONST1;
X b = CONST2;
X for (i = 0; i < COUNT; ++i)
X {
X c = a * b;
X c = c / a;
X c = a * b;
X c = c / a;
X c = a * b;
X c = c / a;
X c = a * b;
X c = c / a;
X c = a * b;
X c = c / a;
X c = a * b;
X c = c / a;
X c = a * b;
X c = c / a;
X }
X printf("Done\n");
X exit(0);
X}
SHAR_EOF
echo shar: extracting iocall.c;
sed 's/^X//' <<'SHAR_EOF' >iocall.c
X/* iocall.c:
X *
X * Author: Jan Stubbs, NCR, ..!sdcsvax!ncr-sd!stubbs
X * Results: Send results to the above author.
X * Version: improved to eliminate real disk writes
X *
X * This benchmark tests speed of Unix system call interface
X * and speed of cpu doing common Unix io system calls.
X *
X * Under normal circumstances, this benchmark will not actually
X * cause any physical disk activity, but will just cause system
X * buffer activity.
X */
X
Xchar buf[512];
Xint fd,count,i,j;
X
Xmain()
X{
X fd = creat("/tmp/testfile",0777);
X close(fd);
X fd = open("/tmp/testfile",2);
X unlink("/tmp/testfile");
X for (i=0;i<=1000;i++) {
X lseek(fd,0,0);
X count = write(fd,buf,500);
X lseek(fd,0,0);
X for (j=0;j<=3;j++)
X count = read(fd,buf,100);
X }
X exit(0);
X}
SHAR_EOF
echo shar: extracting loop.c;
sed 's/^X//' <<'SHAR_EOF' >loop.c
Xmain()
X{
X long i;
X for (i=0; i <1000000L; ++i)
X ;
X exit(0);
X}
SHAR_EOF
echo shar: extracting pipes.c;
sed 's/^X//' <<'SHAR_EOF' >pipes.c
X#define BLOCKS 1024
Xchar buffer[512];
Xint fid[2];
Xmain()
X{
X register int i;
X pipe(fid);
X if (fork()){
X for (i = 0; i < BLOCKS; ++i)
X if (write(fid[1], buffer, 512) < 0)
X printf("Error in writing; i=%d\n", i);
X if (close(fid[1]) != 0)
X printf("Error in parent closing\n");
X }
X else {
X if (close(fid[1]) != 0)
X printf("Error in child closing\n");
X for(;;)
X if (read(fid[0], buffer, 512) == 0) {
X break;
X }
X }
X exit(0);
X}
SHAR_EOF
echo shar: extracting sieve.c;
sed 's/^X//' <<'SHAR_EOF' >sieve.c
X#define TRUE 1
X#define FALSE 0
X#define SIZE 8190
X#define REG register
X
Xchar flags[SIZE+1];
X
Xmain()
X{
X REG int i, prime, k, count, iter;
X
X/* printf("10 iterations\n");*/
X for (iter = 1; iter <= 10; ++iter)
X {
X count = 0;
X for (i = 0; i <= SIZE; ++i)
X flags[i] = TRUE;
X for (i = 0; i <= SIZE; ++i)
X {
X if (flags[i])
X {
X prime = i + i + 3;
X for (k = i + prime; k <= SIZE; k+= prime)
X flags[k] = FALSE;
X ++count;
X }
X }
X }
X/* printf("%d primes\n", count);*/
X exit(0);
X}
SHAR_EOF
echo shar: extracting tst.sh;
sed 's/^X//' <<'SHAR_EOF' >tst.sh
Xsort >sort.$$ <<EOF
XNow
Xis
Xthe
Xtime
Xfor
Xall
Xgood
Xmen
Xto
Xcome
Xto
Xthe
Xaid
Xof
Xtheir
Xcountry
XEOF
Xod sort.$$ | sort -n +1 > od.$$
Xgrep the sort.$$ | tee grep.$$ | wc > wc.$$
Xrm sort.$$ grep.$$ od.$$ wc.$$
SHAR_EOF
echo shar: extracting dwrite.c;
sed 's/^X//' <<'SHAR_EOF' >dwrite.c
X#include <stdio.h>
X#define BLOCKS 256
Xmain()
X{
X char buffer[512];
X char *filename = "a_large_file";
X register int i;
X int fildes;
X if ((fildes = creat(filename, 0640)) < 0) {
X printf("Cannot create file\n");
X exit(1);
X } else {
X close(fildes);
X if ((fildes = open(filename, 1)) < 0) {
X printf("Cannot open file\n");
X exit(1);
X }
X }
X for (i = 0; i < BLOCKS; ++i)
X if (write(fildes, buffer, 512) < 0) {
X printf("Error writing block %d\n", i);
X exit (1);
X }
X close(fildes);
X exit(0);
X}
SHAR_EOF
echo shar: extracting fibo.c;
sed 's/^X//' <<'SHAR_EOF' >fibo.c
X#define NTIMES 10
X#define NUMBER 24
X#define REG register
X
Xmain()
X{
X REG int i;
X REG unsigned value;
X unsigned fib();
X
X printf("%d iterations: ", NTIMES);
X
X for (i = 1; i <= NTIMES; ++i)
X value = fib(NUMBER);
X
X printf("fibonacci(%d) = %u.\n", NUMBER, value);
X exit(0);
X}
X
Xunsigned fib(x)
Xint x;
X{
X if (x > 2)
X return (fib(x-1) + fib(x-2));
X else
X return (1);
X}
SHAR_EOF
echo shar: extracting iofile.c;
sed 's/^X//' <<'SHAR_EOF' >iofile.c
X#define ERROR -1
X#define READERR 0
X
X#define BEG 0
X#define CURR 1
X#define END 2
X#define READ 0
X#define WRITE 1
X#define UPDATE 2
X
X#define OKCLOSE 0
X#define FILESIZE 65000L
X#define COUNT 500
X
X#define C 13849L
X#define A 25173L
X#define ODDNUM 23
X#define REG
Xlong seed = 7L;
X
Xlong random(), lseek();
X
Xmain(argc, argv)
Xint argc;
Xchar *argv[];
X{
X int i;
X REG long j;
X long pos;
X int fd;
X char buffer[512];
X
X if (argc == 1) argv[1] = "rfile";
X if ((fd = creat(argv[1], 0666)) == ERROR)
X abort("Can't create data file\n");
X else printf("File opened for sequential writing\n");
X for (j = 0; j < sizeof(buffer); ++j) buffer[j] = 'x';
X for (j = FILESIZE; j > 0; j -= sizeof(buffer))
X if (write(fd, buffer, (j > 512) ? 512 : j) == ERROR)
X abort("Unexpected EOF in writing data file\n");
X if (close(fd) != OKCLOSE)
X abort("Error closing data file\n");
X else
X printf("Normal termination writing data file\n");
X if ((fd = open(argv[1], UPDATE)) == ERROR)
X abort("Can't open data file for random reading and writing\n");
X else printf("File opened for random reading and writing\n");
X for (i = 0; i < COUNT; ++i)
X {
X j = random(FILESIZE);
X if (j < 0L)
X j = -j;
X if (FILESIZE - j < ODDNUM)
X continue;
X if ((pos = lseek(fd, j, BEG)) == -1L)
X abort("Error seeking to random offset\n");
X if (read(fd, buffer, ODDNUM) == READERR)
X abort("Error reading at random offset\n");
X j = random(FILESIZE);
X if (j < 0L)
X j = -j;
X if (FILESIZE - j < ODDNUM)
X continue;
X if ((pos = lseek(fd, j, BEG)) == -1L)
X abort("Error seeking to random offset\n");
X if (write(fd, buffer, ODDNUM) == READERR)
X abort("Error writing at random offset\n");
X }
X if (close(fd) != OKCLOSE)
X abort("Error closing data file\n");
X else
X printf("Normal termination from random reading and writing\n");
X exit(0);
X}
X
Xlong random(size)
Xlong size;
X{
X seed = seed * A + C;
X return (seed % size);
X}
Xabort(message)
Xchar *message;
X{
X printf(message);
X exit(ERROR);
X}
SHAR_EOF
echo shar: extracting multi.sh;
sed 's/^X//' <<'SHAR_EOF' >multi.sh
Xfor i
Xdo
X echo $i
X /bin/sh tst.sh &
Xdone
Xwait
SHAR_EOF
echo shar: extracting scall.c;
sed 's/^X//' <<'SHAR_EOF' >scall.c
X#define TIMES 25000
X
Xmain()
X{
X register int i;
X for (i = 0; i < TIMES; ++i)
X getpid();
X exit(0);
X}
SHAR_EOF
echo shar: extracting bytesort.c;
sed 's/^X//' <<'SHAR_EOF' >bytesort.c
X#define REG register
X#define MAXNUM 1000
X#define COUNT 10
X#define MODULUS ((long) 0x20000)
X
X#define C 13849L
X#define A 25173L
X
Xlong seed = 7L;
X
Xlong random();
X
Xlong buffer[MAXNUM] = {0};
X
Xmain()
X{
X REG int i, j;
X long temp;
X
X printf("Filling array and sorting %d times\n", COUNT);
X for (i = 0; i < COUNT; ++i)
X {
X for (j = 0; j < MAXNUM; ++j)
X {
X temp = random(MODULUS);
X if (temp < 0L)
X temp = -temp;
X buffer[j] = temp;
X }
X printf("Buffer full, iteration %d\n", i);
X quick(0, MAXNUM, buffer);
X }
X printf("Done\n");
X exit(0);
X}
X
Xquick(lo, hi, base)
Xint lo, hi;
Xlong base[];
X{
X REG int i, j;
X long pivot, temp;
X
X if (lo < hi)
X {
X for (i = lo, j = hi, pivot = base[hi]; i < j; )
X {
X while (i < j && base[i] < pivot)
X ++i;
X while (j > i && base[j] > pivot)
X --j;
X if (i < j)
X {
X temp = base[i];
X base[i] = base[j];
X base[j] = temp;
X }
X }
X temp = base[i];
X base[i] = base[hi];
X base[hi] = temp;
X quick(lo, i - 1, base);
X quick(i + 1, hi, base);
X }
X}
X
Xlong random(size)
Xlong size;
X{
X seed = seed * A + C;
X return (seed % size);
X}
SHAR_EOF
echo shar: extracting dry.c;
sed 's/^X//' <<'SHAR_EOF' >dry.c
X/*
X * "DHRYSTONE" Benchmark Program
X *
X * Version: C/1, 12/01/84
X *
X * Date: PROGRAM updated 11/02/85, RESULTS updated 12/13/85
X *
X * Author: Reinhold P. Weicker, CACM Vol 27, No 10, 10/84 pg. 1013
X * Translated from ADA by Rick Richardson
X * Every method to preserve ADA-likeness has been used,
X * at the expense of C-ness.
X *
X * Compile: cc -O dry.c -o drynr : No registers
X * cc -O -DREG=register dry.c -o dryr : Registers
X *
X * Defines: Defines are provided for old C compiler's
X * which don't have enums, and can't assign structures.
X * The time(2) function is library dependant; Most
X * return the time in seconds, but beware of some, like
X * Aztec C, which return other units.
X * The LOOPS define is initially set for 50000 loops.
X * If you have a machine with large integers and is
X * very fast, please change this number to 500000 to
X * get better accuracy. Please select the way to
X * measure the execution time using the TIME define.
X * For single user machines, time(2) is adequate. For
X * multi-user machines where you cannot get single-user
X * access, use the times(2) function. If you have
X * neither, use a stopwatch in the dead of night.
X * Use a "printf" at the point marked "start timer"
X * to begin your timings. DO NOT use the UNIX "time(1)"
X * command, as this will measure the total time to
X * run this program, which will (erroneously) include
X * the time to malloc(3) storage and to compute the
X * time it takes to do nothing.
X *
X * Run: drynr; dryr
X *
X * Results: If you get any new machine/OS results, please send to:
X *
X * {ihnp4,vax135,..}!houxm!castor!pcrat!rer
X *
X * and thanks to all that do. Space prevents listing
X * the names of those who have provided some of these
X * results.
X *
X * Note: I order the list in increasing performance of the
X * "with registers" benchmark. If the compiler doesn't
X * provide register variables, then the benchmark
X * is the same for both REG and NOREG. I'm not going
X * to list a compiler in a better place because if it
X * had register variables it might do better. No
X * register variables is a big loss in my book.
X *
X * PLEASE: Send complete information about the machine type,
X * clock speed, OS and C manufacturer/version. If
X * the machine is modified, tell me what was done.
X * On UNIX, execute uname -a and cc -V to get this info.
X *
X * 80x8x NOTE: 80x8x benchers: please try to do all memory models
X * for a particular compiler.
X *
X *--------------------------------RESULTS BEGIN--------------------------------
X *
X * MACHINE MICROPROCESSOR OPERATING COMPILER DHRYSTONES/SEC.
X * TYPE SYSTEM NO REG REGS
X * -------------------------- ------------ ----------- ---------------
X * Commodore 64 6510-1MHz C64 ROM C Power 2.8 36 36
X * HP-110 8086-5.33Mhz MSDOS 2.11 Lattice 2.14 284 284
X * IBM PC/XT 8088-4.77Mhz PC/IX cc 257 287
X * P-E 3205 ? Xelos(SVR2) cc 279 296
X * Perq-II 2901 bitslice Accent S5c cc (CMU) 301 301
X * IBM PC/XT 8088-4.77Mhz COHERENT 2.3.43 MarkWilliams cc 296 317
X * Cosmos 68000-8Mhz UniSoft cc 305 322
X * IBM PC/XT 8088-4.77Mhz Venix/86 2.0 cc 297 324
X * DEC PRO 350 11/23 Venix/PRO SVR2 cc 299 325
X * PC/XT 8088-4.77Mhz Venix/86 SYS V cc 339 377
X * IBM PC 8088-4.77Mhz MSDOS 2.0 b16cc 2.0 310 340
X * Commodore Amiga ? Lattice 3.02 368 371
X * IBM PC 8088-4.77Mhz MSDOS 2.0 CI-C86 2.20M 390 390
X * IBM PC/XT 8088-4.77Mhz PCDOS 2.1 Wizard 2.1 367 403
X * IBM PC/XT 8088-4.77Mhz PCDOS 3.1 Lattice 2.15 403 403 @
X * IBM PC 8088-4.77Mhz PCDOS 3.1 Datalight 1.10 416 416
X * IBM PC/XT 8088-4.77Mhz PCDOS 2.1 Microsoft 3.0 390 427
X * PDP-11/34 - UNIX V7M cc 387 438
X * IBM PC 8088, 4.77mhz PC-DOS 2.1 Aztec C v3.2d 423 454
X * Tandy 1000 V20, 4.77mhz MS-DOS 2.11 Aztec C v3.2d 423 458
X * PDP-11/34 - RSTS/E decus c 438 495
X * Onyx C8002 Z8000-4Mhz IS/1 1.1 (V7) cc 476 511
X * Perkin-Elmer 3230 Xelos (SysV.2) cc 507 565
X * DEC PRO 380 11/73 Venix/PRO SVR2 cc 577 628
X * FHL QT+ 68000-10Mhz Os9/68000 version 1.3 603 649 FH
X * Apollo DN550 68010-?Mhz AegisSR9/IX cc 3.12 666 666
X * HP-110 8086-5.33Mhz MSDOS 2.11 Aztec-C 641 676
X * ATT PC6300 8086-8Mhz MSDOS 2.11 b16cc 2.0 632 684
X * IBM PC/AT 80286-6Mhz PCDOS 3.0 CI-C86 2.1 666 684
X * Tandy 6000 68000-8Mhz Xenix 3.0 cc 694 694
X * IBM PC/AT 80286-6Mhz Xenix 3.0 cc 684 704 MM
X * Macintosh 68000-7.8Mhz 2M Mac Rom Mac C 32 bit int 694 704
X * Macintosh 68000-7.7Mhz - MegaMax C 2.0 661 709
X * IBM PC/AT 80286-6Mhz Xenix 3.0 cc 704 714 LM
X * Codata 3300 68000-8Mhz UniPlus+ (v7) cc 678 725
X * Cadmus 9000 68010-10Mhz UNIX cc 714 735
X * AT&T 6300 8086-8Mhz Venix/86 SVR2 cc 668 743
X * Cadmus 9790 68010-10Mhz 1MB SVR0,Cadmus3.7 cc 720 747
X * NEC PC9801F 8086-8Mhz PCDOS 2.11 Lattice 2.15 768 - @
X * ATT PC6300 8086-8Mhz MSDOS 2.11 CI-C86 2.20M 769 769
X * Burroughs XE550 68010-10Mhz Centix 2.10 cc 769 769 CT1
X * EAGLE/TURBO 8086-8Mhz Venix/86 SVR2 cc 696 779
X * ALTOS 586 8086-10Mhz Xenix 3.0b cc 724 793
X * DEC 11/73 J-11 micro Ultrix-11 V3.0 System V 735 793
X * ATT 3B2/300 WE32000-?Mhz UNIX 5.0.2 cc 735 806
X * Apollo DN320 68010-?Mhz AegisSR9/IX cc 3.12 806 806
X * IRIS-2400 68010-10Mhz UNIX System V cc 772 829
X * Atari 520ST 68000-8Mhz TOS DigResearch 839 846
X * IBM PC/AT 80286-6Mhz PCDOS 3.0 MS 3.0(large) 833 847 LM
X * VAX 11/750 - Ultrix 1.1 4.2BSD cc 781 862
X * P-E 7350A 68000-8MHz UniSoft V.2 cc 821 875
X * VAX 11/750 - UNIX 4.2bsd cc 862 877
X * Fast Mac 68000-7.7Mhz - MegaMax C 2.0 839 904 +
X * IBM PC/XT 8086-9.54Mhz PCDOS 3.1 Microsoft 3.0 833 909 C1
X * DEC 11/44 Ultrix-11 V3.0 System V 862 909
X * Macintosh 68000-7.8Mhz 2M Mac Rom Mac C 16 bit int 877 909 S
X * P-E 3210 ? Xelos R01(SVR2) cc 849 924
X * P-E 3220 ? Ed. 7 v2.3 cc 892 925
X * IBM PC/AT 80286-6Mhz Xenix 3.0 cc -i 909 925
X * AT&T 6300 8086, 8mhz MS-DOS 2.11 Aztec C v3.2d 862 943
X * IBM PC/AT 80286-6Mhz Xenix 3.0 cc 892 961
X * VAX 11/750 w/FPA Eunice 3.2 cc 914 976
X * IBM PC/XT 8086-9.54Mhz PCDOS 3.1 Wizard 2.1 892 980 C1
X * IBM PC/XT 8086-9.54Mhz PCDOS 3.1 Lattice 2.15 980 980 C1
X * Plexus P35 68000-10Mhz UNIX System III cc 984 980
X * PDP-11/73 KDJ11-AA 15Mhz UNIX V7M 2.1 cc 862 981
X * VAX 11/750 w/FPA UNIX 4.3bsd cc 994 997
X * IRIS-1400 68010-10Mhz UNIX System V cc 909 1000
X * IBM PC/AT 80286-6Mhz Venix/86 2.1 cc 961 1000
X * IBM PC/AT 80286-6Mhz PCDOS 3.0 b16cc 2.0 943 1063
X * Zilog S8000/11 Z8001-5.5Mhz Zeus 3.2 cc 1011 1084
X * NSC ICM-3216 NSC 32016-10Mhz UNIX SVR2 cc 1041 1084
X * IBM PC/AT 80286-6Mhz PCDOS 3.0 MS 3.0(small) 1063 1086
X * VAX 11/750 w/FPA VMS VAX-11 C 2.0 958 1091
X * Stride 68000-10Mhz System-V/68 cc 1041 1111
X * ATT PC7300 68010-10Mhz UNIX 5.2 cc 1041 1111
X * P-E 3230 ? Xelos R01(SVR2) cc 1040 1126
X * Stride 68000-12Mhz System-V/68 cc 1063 1136
X * IBM PC/AT 80286-6Mhz Venix/286 SVR2 cc 1056 1149
X * IBM PC/AT 80286-6Mhz PCDOS 3.0 Datalight 1.10 1190 1190
X * ATT PC6300+ 80286-6Mhz MSDOS 3.1 b16cc 2.0 1111 1219
X * IBM PC/AT 80286-6Mhz PCDOS 3.1 Wizard 2.1 1136 1219
X * Sun2/120 68010-10Mhz Sun 4.2BSD cc 1136 1219
X * IBM PC/AT 80286-6Mhz PCDOS 3.0 CI-C86 2.20M 1219 1219
X * MASSCOMP 500 68010-10MHz RTU V3.0 cc (V3.2) 1156 1238
X * Cyb DataMate 68010-12.5Mhz Uniplus 5.0 Unisoft cc 1162 1250
X * PDP 11/70 - UNIX 5.2 cc 1162 1250
X * IBM PC/AT 80286-6Mhz PCDOS 3.1 Lattice 2.15 1250 1250
X * IBM PC/AT 80286-7.5Mhz Venix/86 2.1 cc 1190 1315 *15
X * Sun2/120 68010-10Mhz Standalone cc 1219 1315
X * Intel 380 80286-8Mhz Xenix R3.0up1 cc 1250 1315 *16
X * ATT 3B2/400 WE32100-?Mhz UNIX 5.2 cc 1315 1315
X * P-E 3250XP - Xelos R01(SVR2) cc 1215 1318
X * DG MV4000 - AOS/VS 5.00 cc 1333 1333
X * IBM PC/AT 80286-8Mhz Venix/86 2.1 cc 1275 1380 *16
X * IBM PC/AT 80286-6Mhz MSDOS 3.0 Microsoft 3.0 1250 1388
X * ATT PC6300+ 80286-6Mhz MSDOS 3.1 CI-C86 2.20M 1428 1428
X * COMPAQ/286 80286-8Mhz Venix/286 SVR2 cc 1326 1443
X * IBM PC/AT 80286-7.5Mhz Venix/286 SVR2 cc 1333 1449 *15
X * Cyb DataMate 68010-12.5Mhz Uniplus 5.0 Unisoft cc 1470 1562 S
X * VAX 11/780 - UNIX 5.2 cc 1515 1562
X * MicroVAX-II - - - 1562 1612
X * VAX 11/780 - UNIX 4.3bsd cc 1646 1662
X * Apollo DN660 - AegisSR9/IX cc 3.12 1666 1666
X * ATT 3B20 - UNIX 5.2 cc 1515 1724
X * NEC PC-98XA 80286-8Mhz PCDOS 3.1 Lattice 2.15 1724 1724 @
X * HP9000-500 B series CPU HP-UX 4.02 cc 1724 -
X * IBM PC/STD 80286-8Mhz MSDOS 3.0 Microsoft 3.0 1724 1785 C2
X * DEC-2065 KL10-Model B TOPS-20 6.1FT5 Port. C Comp. 1937 1946
X * Gould PN6005 - UTX 1.1(4.2BSD) cc 1675 1964
X * DEC2060 KL-10 TOPS-20 cc 2000 2000 &
X * VAX 11/785 - UNIX 5.2 cc 2083 2083
X * VAX 11/785 - VMS VAX-11 C 2.0 2083 2083
X * VAX 11/785 - UNIX SVR2 cc 2123 2083
X * VAX 11/785 - UNIX 4.3bsd cc 2135 2136
X * Pyramid 90x - OSx 2.3 cc 2272 2272
X * Pyramid 90x FPA,cache,4Mb OSx 2.5 cc no -O 2777 2777
X * Alliant FX-8 CE ? ? 2622 2901 FX
X * Pyramid 90x w/cache OSx 2.5 cc w/-O 3333 3333
X * IBM-4341-II - VM/SP3 Waterloo C 1.2 3333 3333
X * IRIS-2400T 68020-16.67Mhz UNIX System V cc 3105 3401
X * SUN 3/75 68020-16.67Mhz SUN 4.2 V3 cc 3333 3571
X * IBM-4341 Model 12 UTS 5.0 ? 3685 3685
X * SUN-3/160 68020-16.67Mhz Sun 4.2 V3.0A cc 3381 3764
X * Sun 3/180 68020-16.67Mhz Sun 4.2 cc 3333 3846
X * IBM-4341 Model 12 UTS 5.0 ? 3910 3910 MN
X * MC 5400 68020-16.67MHz RTU V3.0 cc (V4.0) 3952 4054
X * NCR Tower32 68020-16.67Mhz SYS 5.0 Rel 2.0 cc 3846 4545
X * Gould PN9080 - UTX-32 1.1c cc - 4629
X * MC 5600/5700 68020-16.67MHz RTU V3.0 cc (V4.0) 4504 4746 %
X * Gould 1460-342 ECL proc UTX/32 1.1/c cc 5342 5677 G1
X * VAX 8600 - UNIX 4.3bsd cc 7024 7088
X * VAX 8600 - VMS VAX-11 C 2.0 7142 7142
X * CCI POWER 6/32 COS(SV+4.2) cc 7500 7800
X * CCI POWER 6/32 POWER 6 UNIX/V cc 8236 8498
X * CCI POWER 6/32 4.2 Rel. 1.2b cc 8963 9544
X * Sperry (CCI Power 6) 4.2BSD cc 9345 10000
X * CRAY-X-MP/12 105Mhz COS 1.14 Cray C 10204 10204
X * IBM-3083 - UTS 5.0 Rel 1 cc 16666 12500
X * CRAY-1A 80Mhz CTSS Cray C 2.0 12100 13888
X * IBM-3083 - VM/CMS HPO 3.4 Waterloo C 1.2 13889 13889
X * Amdahl 470 V/8 UTS/V 5.2 cc v1.23 15560 15560
X * CRAY-X-MP/48 105Mhz CTSS Cray C 2.0 15625 17857
X * Amdahl 580 - UTS 5.0 Rel 1.2 cc v1.5 23076 23076
X * Amdahl 5860 UTS/V 5.2 cc v1.23 28970 28970
X *
X * * Crystal changed from 'stock' to listed value.
X * + This Macintosh was upgraded from 128K to 512K in such a way that
X * the new 384K of memory is not slowed down by video generator accesses.
X * % Single processor; MC == MASSCOMP
X * & A version 7 C compiler written at New Mexico Tech.
X * @ vanilla Lattice compiler used with MicroPro standard library
X * S Shorts used instead of ints
X * LM Large Memory Model. (Otherwise, all 80x8x results are small model)
X * MM Medium Memory Model. (Otherwise, all 80x8x results are small model)
X * C1 Univation PC TURBO Co-processor; 9.54Mhz 8086, 640K RAM
X * C2 Seattle Telecom STD-286 board
X * C? Unknown co-processor board?
X * CT1 Convergent Technologies MegaFrame, 1 processor.
X * MN Using Mike Newtons 'optimizer' (see net.sources).
X * G1 This Gould machine has 2 processors and was able to run 2 dhrystone
X * Benchmarks in parallel with no slowdown.
X * FH FHC == Frank Hogg Labs (Hazelwood Uniquad 2 in an FHL box).
X * FX The FX-8 has two kinds of processors. This figure is for CE's
X * (computation engines). The other processor type is an IP (interactive
X * processor) which is a 68010-12Mhz. Figures were not precisely
X * determined for the IP.
X * ? I don't trust results marked with '?'. These were sent to me with
X * either incomplete info, or with times that just don't make sense.
X * ?? means I think the performance is too poor, ?! means too good.
X * If anybody can confirm these figures, please respond.
X *
X *--------------------------------RESULTS END----------------------------------
X *
X * The following program contains statements of a high-level programming
X * language (C) in a distribution considered representative:
X *
X * assignments 53%
X * control statements 32%
X * procedure, function calls 15%
X *
X * 100 statements are dynamically executed. The program is balanced with
X * respect to the three aspects:
X * - statement type
X * - operand type (for simple data types)
X * - operand access
X * operand global, local, parameter, or constant.
X *
X * The combination of these three aspects is balanced only approximately.
X *
X * The program does not compute anything meaningfull, but it is
X * syntactically and semantically correct.
X *
X */
X
X/* Accuracy of timings and human fatigue controlled by next two lines */
X#define LOOPS 50000 /* Use this for slow or 16 bit machines */
X/*#define LOOPS 500000 /* Use this for faster machines */
X
X/* Compiler dependent options */
X#undef NOENUM /* Define if compiler has no enum's */
X#undef NOSTRUCTASSIGN /* Define if compiler can't assign structures */
X/* define only one of the next two defines */
X#define TIMES /* Use times(2) time function */
X/*#define TIME /* Use time(2) time function */
X
X/* define the granularity of your times(2) function (when used) */
X#define HZ 60 /* times(2) returns 1/60 second (most) */
X/*#define HZ 100 /* times(2) returns 1/100 second (WECo) */
X
X
X
X#ifdef NOSTRUCTASSIGN
X#define structassign(d, s) memcpy(&(d), &(s), sizeof(d))
X#else
X#define structassign(d, s) d = s
X#endif
X
X#ifdef NOENUM
X#define Ident1 1
X#define Ident2 2
X#define Ident3 3
X#define Ident4 4
X#define Ident5 5
Xtypedef int Enumeration;
X#else
Xtypedef enum {Ident1, Ident2, Ident3, Ident4, Ident5} Enumeration;
X#endif
X
Xtypedef int OneToThirty;
Xtypedef int OneToFifty;
Xtypedef char CapitalLetter;
Xtypedef char String30[31];
Xtypedef int Array1Dim[51];
Xtypedef int Array2Dim[51][51];
X
Xstruct Record
X{
X struct Record *PtrComp;
X Enumeration Discr;
X Enumeration EnumComp;
X OneToFifty IntComp;
X String30 StringComp;
X};
X
Xtypedef struct Record RecordType;
Xtypedef RecordType * RecordPtr;
Xtypedef int boolean;
X
X#define NULL 0
X#define TRUE 1
X#define FALSE 0
X
X#ifndef REG
X#define REG
X#endif
X
Xextern Enumeration Func1();
Xextern boolean Func2();
X
X#ifdef TIMES
X#include <sys/types.h>
X#include <sys/times.h>
X#endif
X
Xmain()
X{
X Proc0();
X exit(0);
X}
X
X/*
X * Package 1
X */
Xint IntGlob;
Xboolean BoolGlob;
Xchar Char1Glob;
Xchar Char2Glob;
XArray1Dim Array1Glob;
XArray2Dim Array2Glob;
XRecordPtr PtrGlb;
XRecordPtr PtrGlbNext;
X
XProc0()
X{
X OneToFifty IntLoc1;
X REG OneToFifty IntLoc2;
X OneToFifty IntLoc3;
X REG char CharLoc;
X REG char CharIndex;
X Enumeration EnumLoc;
X String30 String1Loc;
X String30 String2Loc;
X extern char *malloc();
X
X#ifdef TIME
X long time();
X long starttime;
X long benchtime;
X long nulltime;
X register unsigned int i;
X
X starttime = time( (long *) 0);
X for (i = 0; i < LOOPS; ++i);
X nulltime = time( (long *) 0) - starttime; /* Computes o'head of loop */
X#endif
X#ifdef TIMES
X time_t starttime;
X time_t benchtime;
X time_t nulltime;
X struct tms tms;
X register unsigned int i;
X
X times(&tms); starttime = tms.tms_utime;
X for (i = 0; i < LOOPS; ++i);
X times(&tms);
X nulltime = tms.tms_utime - starttime; /* Computes overhead of looping */
X#endif
X
X PtrGlbNext = (RecordPtr) malloc(sizeof(RecordType));
X PtrGlb = (RecordPtr) malloc(sizeof(RecordType));
X PtrGlb->PtrComp = PtrGlbNext;
X PtrGlb->Discr = Ident1;
X PtrGlb->EnumComp = Ident3;
X PtrGlb->IntComp = 40;
X strcpy(PtrGlb->StringComp, "DHRYSTONE PROGRAM, SOME STRING");
X
X/*****************
X-- Start Timer --
X*****************/
X#ifdef TIME
X starttime = time( (long *) 0);
X#endif
X#ifdef TIMES
X times(&tms); starttime = tms.tms_utime;
X#endif
X for (i = 0; i < LOOPS; ++i)
X {
X
X Proc5();
X Proc4();
X IntLoc1 = 2;
X IntLoc2 = 3;
X strcpy(String2Loc, "DHRYSTONE PROGRAM, 2'ND STRING");
X EnumLoc = Ident2;
X BoolGlob = ! Func2(String1Loc, String2Loc);
X while (IntLoc1 < IntLoc2)
X {
X IntLoc3 = 5 * IntLoc1 - IntLoc2;
X Proc7(IntLoc1, IntLoc2, &IntLoc3);
X ++IntLoc1;
X }
X Proc8(Array1Glob, Array2Glob, IntLoc1, IntLoc3);
X Proc1(PtrGlb);
X for (CharIndex = 'A'; CharIndex <= Char2Glob; ++CharIndex)
X if (EnumLoc == Func1(CharIndex, 'C'))
X Proc6(Ident1, &EnumLoc);
X IntLoc3 = IntLoc2 * IntLoc1;
X IntLoc2 = IntLoc3 / IntLoc1;
X IntLoc2 = 7 * (IntLoc3 - IntLoc2) - IntLoc1;
X Proc2(&IntLoc1);
X }
X
X/*****************
X-- Stop Timer --
X*****************/
X
X#ifdef TIME
X benchtime = time( (long *) 0) - starttime - nulltime;
X printf("Dhrystone time for %ld passes = %ld\n",
X (long) LOOPS, benchtime);
X printf("This machine benchmarks at %ld dhrystones/second\n",
X ((long) LOOPS) / benchtime);
X#endif
X#ifdef TIMES
X times(&tms);
X benchtime = tms.tms_utime - starttime - nulltime;
X printf("Dhrystone time for %ld passes = %ld\n",
X (long) LOOPS, benchtime/HZ);
X printf("This machine benchmarks at %ld dhrystones/second\n",
X ((long) LOOPS) * HZ / benchtime);
X#endif
X
X}
X
XProc1(PtrParIn)
XREG RecordPtr PtrParIn;
X{
X#define NextRecord (*(PtrParIn->PtrComp))
X
X structassign(NextRecord, *PtrGlb);
X PtrParIn->IntComp = 5;
X NextRecord.IntComp = PtrParIn->IntComp;
X NextRecord.PtrComp = PtrParIn->PtrComp;
X Proc3(NextRecord.PtrComp);
X if (NextRecord.Discr == Ident1)
X {
X NextRecord.IntComp = 6;
X Proc6(PtrParIn->EnumComp, &NextRecord.EnumComp);
X NextRecord.PtrComp = PtrGlb->PtrComp;
X Proc7(NextRecord.IntComp, 10, &NextRecord.IntComp);
X }
X else
X structassign(*PtrParIn, NextRecord);
X
X#undef NextRecord
X}
X
XProc2(IntParIO)
XOneToFifty *IntParIO;
X{
X REG OneToFifty IntLoc;
X REG Enumeration EnumLoc;
X
X IntLoc = *IntParIO + 10;
X for(;;)
X {
X if (Char1Glob == 'A')
X {
X --IntLoc;
X *IntParIO = IntLoc - IntGlob;
X EnumLoc = Ident1;
X }
X if (EnumLoc == Ident1)
X break;
X }
X}
X
XProc3(PtrParOut)
XRecordPtr *PtrParOut;
X{
X if (PtrGlb != NULL)
X *PtrParOut = PtrGlb->PtrComp;
X else
X IntGlob = 100;
X Proc7(10, IntGlob, &PtrGlb->IntComp);
X}
X
XProc4()
X{
X REG boolean BoolLoc;
X
X BoolLoc = Char1Glob == 'A';
X BoolLoc |= BoolGlob;
X Char2Glob = 'B';
X}
X
XProc5()
X{
X Char1Glob = 'A';
X BoolGlob = FALSE;
X}
X
Xextern boolean Func3();
X
XProc6(EnumParIn, EnumParOut)
XREG Enumeration EnumParIn;
XREG Enumeration *EnumParOut;
X{
X *EnumParOut = EnumParIn;
X if (! Func3(EnumParIn) )
X *EnumParOut = Ident4;
X switch (EnumParIn)
X {
X case Ident1: *EnumParOut = Ident1; break;
X case Ident2: if (IntGlob > 100) *EnumParOut = Ident1;
X else *EnumParOut = Ident4;
X break;
X case Ident3: *EnumParOut = Ident2; break;
X case Ident4: break;
X case Ident5: *EnumParOut = Ident3;
X }
X}
X
XProc7(IntParI1, IntParI2, IntParOut)
XOneToFifty IntParI1;
XOneToFifty IntParI2;
XOneToFifty *IntParOut;
X{
X REG OneToFifty IntLoc;
X
X IntLoc = IntParI1 + 2;
X *IntParOut = IntParI2 + IntLoc;
X}
X
XProc8(Array1Par, Array2Par, IntParI1, IntParI2)
XArray1Dim Array1Par;
XArray2Dim Array2Par;
XOneToFifty IntParI1;
XOneToFifty IntParI2;
X{
X REG OneToFifty IntLoc;
X REG OneToFifty IntIndex;
X
X IntLoc = IntParI1 + 5;
X Array1Par[IntLoc] = IntParI2;
X Array1Par[IntLoc+1] = Array1Par[IntLoc];
X Array1Par[IntLoc+30] = IntLoc;
X for (IntIndex = IntLoc; IntIndex <= (IntLoc+1); ++IntIndex)
X Array2Par[IntLoc][IntIndex] = IntLoc;
X ++Array2Par[IntLoc][IntLoc-1];
X Array2Par[IntLoc+20][IntLoc] = Array1Par[IntLoc];
X IntGlob = 5;
X}
X
XEnumeration Func1(CharPar1, CharPar2)
XCapitalLetter CharPar1;
XCapitalLetter CharPar2;
X{
X REG CapitalLetter CharLoc1;
X REG CapitalLetter CharLoc2;
X
X CharLoc1 = CharPar1;
X CharLoc2 = CharLoc1;
X if (CharLoc2 != CharPar2)
X return (Ident1);
X else
X return (Ident2);
X}
X
Xboolean Func2(StrParI1, StrParI2)
XString30 StrParI1;
XString30 StrParI2;
X{
X REG OneToThirty IntLoc;
X REG CapitalLetter CharLoc;
X
X IntLoc = 1;
X while (IntLoc <= 1)
X if (Func1(StrParI1[IntLoc], StrParI2[IntLoc+1]) == Ident1)
X {
X CharLoc = 'A';
X ++IntLoc;
X }
X if (CharLoc >= 'W' && CharLoc <= 'Z')
X IntLoc = 7;
X if (CharLoc == 'X')
X return(TRUE);
X else
X {
X if (strcmp(StrParI1, StrParI2) > 0)
X {
X IntLoc += 7;
X return (TRUE);
X }
X else
X return (FALSE);
X }
X}
X
Xboolean Func3(EnumParIn)
XREG Enumeration EnumParIn;
X{
X REG Enumeration EnumLoc;
X
X EnumLoc = EnumParIn;
X if (EnumLoc == Ident3) return (TRUE);
X return (FALSE);
X}
X
X#ifdef NOSTRUCTASSIGN
Xmemcpy(d, s, l)
Xregister char *d;
Xregister char *s;
Xint l;
X{
X while (l--) *d++ = *s++;
X}
X#endif
SHAR_EOF
echo shar: extracting dryresults.sh;
sed 's/^X//' <<'SHAR_EOF' >dryresults.sh
X#
X# Pick out just the results lines from the dry.c source file
X#
Xsed -e '1,/RESULTS BEGIN/d' -e '/RESULTS END/,$d' <dry.c >dry.results
SHAR_EOF
echo shar: extracting gen_rpt;
sed 's/^X//' <<'SHAR_EOF' >gen_rpt
X#
X# Crunch the raw output from the various benchmarks into
X# a reasonably neat listing. Sorry, this is gross shell
X# programming to the max.
X#
XTMP=/tmp/$$
XRPT=$2; export RPT
Xcp $1 $TMP
Xed - $TMP <<EOF
XH
Xg/^\$/d
Xg/^[0-9].*/d
Xg/^ /s///
Xg/^for/d
Xg/^File/d
Xg/^Normal/d
Xg/^Filling/d
Xg/^Buffer/d
Xg/^Done/d
Xg/^Dhrystone/d
Xg/time [^ ]* /s///
Xg/^real/.-1,.j
Xg/^user/.-1,.j
Xg/^sys/.-1,.j
Xg/^This machine benchmarks at/.-1,.j
Xg/This machine benchmarks at/s///
Xg/real/s///
Xg/user/s///
Xg/sys/s///
Xg/ */s// /g
X1i
XBENCHMARK REAL USER SYS
X--------- ---- ---- ---
X.
Xw
Xq
XEOF
Xuname -a >$RPT
Xecho >>$RPT
XQUEST="MANUF MODEL CPU CLOCK RAM DISK FPA"
Xecho "Please answer $QUEST questions below."
Xecho "e.g. MANUF: IBM; MODEL: PC/AT; CPU: 80286; CLOCK: 6Mhz;"
Xecho " RAM: 2MB; DISK: 20MB CMI; FPA: 80287"
Xfor i in $QUEST
Xdo
X echo "$i: \c" | tee /dev/tty >>$RPT
X read a
X echo "$a" >>$RPT
Xdone
Xecho >>$RPT
Xnewform -i40,50,60,70 <$TMP >>$RPT
Xecho >>$RPT
Xdate >>$RPT
Xrm $TMP
SHAR_EOF
exit
More information about the Comp.sources.unix
mailing list