⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dhryst~1.c

📁 操作系统源代码
💻 C
字号:
/* dhrystone - benchmark program */#define REGISTER/* * *	"DHRYSTONE" Benchmark Program * *	Version:	C/1.1, 12/01/84 * *	Date:		PROGRAM updated 01/06/86, COMMENTS changed 01/31/87 * *	Author:		Reinhold P. Weicker,  CACM Vol 27, No 10, 10/84 pg.1013 *			Translated from ADA by Rick Richardson *			Every method to preserve ADA-likeness has been used, *			at the expense of C-ness. * *	Compile:	cc -O dry.c -o drynr			: No registers *			cc -O -DREG=register dry.c -o dryr	: Registers * *	Defines:	Defines are provided for old C compiler's *			which don't have enums, and can't assign structures. *			The time(2) function is library dependant; Most *			return the time in seconds, but beware of some, like *			Aztec C, which return other units. *			The LOOPS define is initially set for 50000 loops. *			If you have a machine with large integers and is *			very fast, please change this number to 500000 to *			get better accuracy.  Please select the way to *			measure the execution time using the TIME define. *			For single user machines, time(2) is adequate. For *			multi-user machines where you cannot get single-user *			access, use the times(2) function.  Be careful to *			adjust the HZ parameter below for the units which *			are returned by your times(2) function.  You can *			sometimes find this in <sys/param.h>.  If you have *			neither time(2) nor times(2), use a stopwatch in *			the dead of the night. *			Use a "printf" at the point marked "start timer" *			to begin your timings. DO NOT use the UNIX "time(1)" *			command, as this will measure the total time to *			run this program, which will (erroneously) include *			the time to malloc(3) storage and to compute the *			time it takes to do nothing. * *	Run:		drynr; dryr * *	Results:	If you get any new machine/OS results, please send to: * *				ihnp4!castor!pcrat!rick * *			and thanks to all that do. * *	Note:		I order the list in increasing performance of the *			"with registers" benchmark.  If the compiler doesn't *			provide register variables, then the benchmark *			is the same for both REG and NOREG. * *	PLEASE:		Send complete information about the machine type, *			clock speed, OS and C manufacturer/version.  If *			the machine is modified, tell me what was done. *			On UNIX, execute uname -a and cc -V to get this info. * *	80x8x NOTE:	80x8x benchers: please try to do all memory models *			for a particular compiler. * * *	The following program contains statements of a high-level programming *	language (C) in a distribution considered representative: * *	assignments			53% *	control statements		32% *	procedure, function calls	15% * *	100 statements are dynamically executed.  The program is balanced with *	respect to the three aspects: *		- statement type *		- operand type (for simple data types) *		- operand access *			operand global, local, parameter, or constant. * *	The combination of these three aspects is balanced only approximately. * *	The program does not compute anything meaningfull, but it is *	syntactically and semantically correct. * */#include <sys/types.h>#include <stdlib.h>#include <string.h>#include <time.h>#include <stdio.h>#include <signal.h>#include <unistd.h>/* Accuracy of timings and human fatigue controlled by next two lines *//*#define LOOPS	50000	*/	/* Use this for slow or 16 bit machines *//*#define LOOPS	500000 */	/* Use this for faster machines *//*#define LOOPS	(sizeof(int) == 2 ? 50000 : 1000000)*//* Seconds to run */#define SECONDS	15/* Compiler dependent options */#define	NOENUM			/* Define if compiler has no enum's *//* #define NOSTRUCTASSIGN */	/* Define if compiler can't assign structures*//* Define only one of the next two defines */#define TIMES			/* Use times(2) time function *//*#define TIME	*/		/* Use time(2) time function */#ifdef TIME/* Ganularity of time(2) is of course 1 second */#define HZ	1#endif#ifdef TIMES/* Define the granularity of your times(2) function *//*#define HZ	50 */		/* times(2) returns 1/50 second (europe?) */#define HZ	60		/* times(2) returns 1/60 second (most) *//*#define HZ	100 	*/	/* times(2) returns 1/100 second (WECo) */#endif/* For compatibility with goofed up version *//*#undef GOOF		*/	/* Define if you want the goofed up version */#ifdef GOOFchar Version[] = "1.0";#elsechar Version[] = "1.1";#endif#ifdef	NOSTRUCTASSIGN#define	structassign(d, s)	memcpy(&(d), &(s), sizeof(d))#else#define	structassign(d, s)	d = s#endif#ifdef	NOENUM#define	Ident1	1#define	Ident2	2#define	Ident3	3#define	Ident4	4#define	Ident5	5typedef int Enumeration;#elsetypedef enum {  Ident1, Ident2, Ident3, Ident4, Ident5} Enumeration;#endiftypedef int OneToThirty;typedef int OneToFifty;typedef char CapitalLetter;typedef char String30[31];typedef int Array1Dim[51];typedef int Array2Dim[51][51];struct Record {  struct Record *PtrComp;  Enumeration Discr;  Enumeration EnumComp;  OneToFifty IntComp;  String30 StringComp;};typedef struct Record RecordType;typedef RecordType *RecordPtr;typedef int boolean;#ifdef NULL#undef NULL#endif#define	NULL		0#define	TRUE		1#define	FALSE		0#ifndef REG#define	REG#endif#ifdef TIMES#include <sys/times.h>#endif_PROTOTYPE(int main, (void));_PROTOTYPE(void prep_timer, (void));_PROTOTYPE(void timeout, (int sig));_PROTOTYPE(void Proc0, (void));_PROTOTYPE(void Proc1, (RecordPtr PtrParIn));_PROTOTYPE(void Proc2, (OneToFifty *IntParIO));_PROTOTYPE(void Proc3, (RecordPtr *PtrParOut));_PROTOTYPE(void Proc4, (void));_PROTOTYPE(void Proc5, (void));_PROTOTYPE(void Proc6, (Enumeration EnumParIn, Enumeration *EnumParOut));_PROTOTYPE(void Proc7, (OneToFifty IntParI1, OneToFifty IntParI2, 						OneToFifty *IntParOut));_PROTOTYPE(void Proc8, (Array1Dim Array1Par, Array2Dim Array2Par, 				OneToFifty IntParI1, OneToFifty IntParI2));/*_PROTOTYPE(Enumeration Func1,(CapitalLetter CharPar1, CapitalLetter CharPar2));*/_PROTOTYPE(boolean Func2, (String30 StrParI1, String30 StrParI2));_PROTOTYPE(boolean Func3, (Enumeration EnumParIn));_PROTOTYPE(Enumeration Func1, (int CharPar1, int CharPar2));int main(){  Proc0();  return(0);}#if __STDC__volatile int done;#elseint done;#endifvoid prep_timer(){  signal(SIGALRM, timeout);  done = 0;}void timeout(sig)int sig;{  done = 1;}/* Package 1  */int IntGlob;boolean BoolGlob;char Char1Glob;char Char2Glob;Array1Dim Array1Glob;Array2Dim Array2Glob;RecordPtr PtrGlb;RecordPtr PtrGlbNext;void Proc0(){  OneToFifty IntLoc1;  REG OneToFifty IntLoc2;  OneToFifty IntLoc3;  REG char CharIndex;  Enumeration EnumLoc;  String30 String1Loc;  String30 String2Loc;  register unsigned long i;  unsigned long starttime;  unsigned long benchtime;  unsigned long nulltime;  unsigned long nullloops;  unsigned long benchloops;#ifdef TIMES  struct tms tms;#endif  i = 0;  prep_timer();#ifdef TIME  starttime = time((long *) 0);#endif#ifdef TIMES  times(&tms);  starttime = tms.tms_utime;#endif  alarm(1);  while (!done) i++;#ifdef TIME  nulltime = time((long *) 0) - starttime;	/* Computes o'head of loop */#endif#ifdef TIMES  times(&tms);  nulltime = tms.tms_utime - starttime;	/* Computes overhead of looping */#endif  nullloops = i;  PtrGlbNext = (RecordPtr) malloc(sizeof(RecordType));  PtrGlb = (RecordPtr) malloc(sizeof(RecordType));  PtrGlb->PtrComp = PtrGlbNext;  PtrGlb->Discr = Ident1;  PtrGlb->EnumComp = Ident3;  PtrGlb->IntComp = 40;  strcpy(PtrGlb->StringComp, "DHRYSTONE PROGRAM, SOME STRING");#ifndef	GOOF  strcpy(String1Loc, "DHRYSTONE PROGRAM, 1'ST STRING");	/* GOOF */#endif  Array2Glob[8][7] = 10;	/* Was missing in published program *//*****************-- Start Timer --*****************/  i = 0;  prep_timer();#ifdef TIME  starttime = time((long *) 0);#endif#ifdef TIMES  times(&tms);  starttime = tms.tms_utime;#endif  alarm(SECONDS);  while (!done) {	i++;	Proc5();	Proc4();	IntLoc1 = 2;	IntLoc2 = 3;	strcpy(String2Loc, "DHRYSTONE PROGRAM, 2'ND STRING");	EnumLoc = Ident2;	BoolGlob = !Func2(String1Loc, String2Loc);	while (IntLoc1 < IntLoc2) {		IntLoc3 = 5 * IntLoc1 - IntLoc2;		Proc7(IntLoc1, IntLoc2, &IntLoc3);		++IntLoc1;	}	Proc8(Array1Glob, Array2Glob, IntLoc1, IntLoc3);	Proc1(PtrGlb);	for (CharIndex = 'A'; CharIndex <= Char2Glob; ++CharIndex)		if (EnumLoc == Func1(CharIndex, 'C'))			Proc6(Ident1, &EnumLoc);	IntLoc3 = IntLoc2 * IntLoc1;	IntLoc2 = IntLoc3 / IntLoc1;	IntLoc2 = 7 * (IntLoc3 - IntLoc2) - IntLoc1;	Proc2(&IntLoc1);  }/*****************-- Stop Timer --*****************/#ifdef TIME  benchtime = time((long *) 0) - starttime;#endif#ifdef TIMES  times(&tms);  benchtime = tms.tms_utime - starttime;#endif  benchloops = i;  /* Approximately correct benchtime to the nulltime. */  benchtime -= nulltime / (nullloops / benchloops);  printf("Dhrystone(%s) time for %lu passes = %lu.%02lu\n",         Version,         benchloops, benchtime / HZ, benchtime % HZ * 100 / HZ);  printf("This machine benchmarks at %lu dhrystones/second\n",         benchloops * HZ / benchtime);}void Proc1(PtrParIn)REG RecordPtr PtrParIn;{#define	NextRecord	(*(PtrParIn->PtrComp))  structassign(NextRecord, *PtrGlb);  PtrParIn->IntComp = 5;  NextRecord.IntComp = PtrParIn->IntComp;  NextRecord.PtrComp = PtrParIn->PtrComp;  Proc3((RecordPtr *)NextRecord.PtrComp);  if (NextRecord.Discr == Ident1) {	NextRecord.IntComp = 6;	Proc6(PtrParIn->EnumComp, &NextRecord.EnumComp);	NextRecord.PtrComp = PtrGlb->PtrComp;	Proc7(NextRecord.IntComp, 10, &NextRecord.IntComp);  } else	structassign(*PtrParIn, NextRecord);#undef	NextRecord}void Proc2(IntParIO)OneToFifty *IntParIO;{  REG OneToFifty IntLoc;  REG Enumeration EnumLoc;  IntLoc = *IntParIO + 10;  for (;;) {	if (Char1Glob == 'A') {		--IntLoc;		*IntParIO = IntLoc - IntGlob;		EnumLoc = Ident1;	}	if (EnumLoc == Ident1) break;  }}void Proc3(PtrParOut)RecordPtr *PtrParOut;{  if (PtrGlb != NULL)	*PtrParOut = PtrGlb->PtrComp;  else	IntGlob = 100;  Proc7(10, IntGlob, &PtrGlb->IntComp);}void Proc4(){  REG boolean BoolLoc;  BoolLoc = Char1Glob == 'A';  BoolLoc |= BoolGlob;  Char2Glob = 'B';}void Proc5(){  Char1Glob = 'A';  BoolGlob = FALSE;}void Proc6(EnumParIn, EnumParOut)REG Enumeration EnumParIn;REG Enumeration *EnumParOut;{  *EnumParOut = EnumParIn;  if (!Func3(EnumParIn)) *EnumParOut = Ident4;  switch (EnumParIn) {      case Ident1:	*EnumParOut = Ident1;	break;      case Ident2:	if (IntGlob > 100)		*EnumParOut = Ident1;	else		*EnumParOut = Ident4;	break;      case Ident3:	*EnumParOut = Ident2;	break;      case Ident4:	break;      case Ident5:	*EnumParOut = Ident3;}}void Proc7(IntParI1, IntParI2, IntParOut)OneToFifty IntParI1;OneToFifty IntParI2;OneToFifty *IntParOut;{  REG OneToFifty IntLoc;  IntLoc = IntParI1 + 2;  *IntParOut = IntParI2 + IntLoc;}void Proc8(Array1Par, Array2Par, IntParI1, IntParI2)Array1Dim Array1Par;Array2Dim Array2Par;OneToFifty IntParI1;OneToFifty IntParI2;{  REG OneToFifty IntLoc;  REG OneToFifty IntIndex;  IntLoc = IntParI1 + 5;  Array1Par[IntLoc] = IntParI2;  Array1Par[IntLoc + 1] = Array1Par[IntLoc];  Array1Par[IntLoc + 30] = IntLoc;  for (IntIndex = IntLoc; IntIndex <= (IntLoc + 1); ++IntIndex)	Array2Par[IntLoc][IntIndex] = IntLoc;  ++Array2Par[IntLoc][IntLoc - 1];  Array2Par[IntLoc + 20][IntLoc] = Array1Par[IntLoc];  IntGlob = 5;}Enumeration Func1(CharPar1, CharPar2)CapitalLetter CharPar1;CapitalLetter CharPar2;{  REG CapitalLetter CharLoc1;  REG CapitalLetter CharLoc2;  CharLoc1 = CharPar1;  CharLoc2 = CharLoc1;  if (CharLoc2 != CharPar2)	return(Ident1);  else	return(Ident2);}boolean Func2(StrParI1, StrParI2)String30 StrParI1;String30 StrParI2;{  REG OneToThirty IntLoc;  REG CapitalLetter CharLoc;  IntLoc = 1;  while (IntLoc <= 1)	if (Func1(StrParI1[IntLoc], StrParI2[IntLoc + 1]) == Ident1) {		CharLoc = 'A';		++IntLoc;	}  if (CharLoc >= 'W' && CharLoc <= 'Z') IntLoc = 7;  if (CharLoc == 'X')	return(TRUE);  else {	if (strcmp(StrParI1, StrParI2) > 0) {		IntLoc += 7;		return(TRUE);	} else		return(FALSE);  }}boolean Func3(EnumParIn)REG Enumeration EnumParIn;{  REG Enumeration EnumLoc;  EnumLoc = EnumParIn;  if (EnumLoc == Ident3) return(TRUE);  return(FALSE);}#ifdef	NOSTRUCTASSIGNmemcpy(d, s, l)register char *d;register char *s;register int l;{  while (l--) *d++ = *s++;}#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -