/* bm.c  01-May-89  A.J.Travis *//* * Small-C Benchmarks * * Based on Chris Sadler's Pascal Benchmarks in PCW Oct 1986 * and the 'tak' benchmark from Acorn User, Jun 86, pp179 */#include <stdio.h>int matrix[11];int j, k, l, x;int test[16];int n;int main(){	/* set up test vectors */	test[1] = magnifier;	test[2] = forloop;	test[3] = whileloop;	test[4] = doloop;	test[5] = literalassign;	test[6] = memoryaccess;	test[7] = arithmetic;	test[8] = algebra;	test[9] = vector;	test[10] = equalif;	test[11] = unequalif;	test[12] = noparameter;	test[13] = value;	test[14] = reference;	test[15] = dotak;	/* select benchmarks */	do {		printf("\fSmall-C Benchmarks:\n\n");		printf("magnifier = 10,000 iterations\n\n");		printf(" 0: quit\n");		printf(" 1: magnifier\n");		printf(" 2: forloop\n");		printf(" 3: whileloop\n");		printf(" 4: doloop\n");		printf(" 5: literalassign\n");		printf(" 6: memoryaccess\n");		printf(" 7: arithmetic\n");		printf(" 8: algebra\n");		printf(" 9: vector\n");		printf("10: equalif\n");		printf("11: unequalif\n");		printf("12: noparameter\n");		printf("13: value\n");		printf("14: reference\n");		printf("15: tak\nn");		printf("test? ");		scanf("%d", &n);		if (n > 0 & n < 15)			test[n]();	} while (n);	exit(0);}/* * 'for' loop magnifier */magnifier(){	printf("start\n");	for (k = 0; k < 10000; k++)		;	printf("finish\007\n");}/* * 'for' loop benchmark */forloop(){	printf("start\n");	for (k = 0; k < 10000; k++)		for (j = 0; j < 10; j++)			;	printf("finish\007\n");}/* * 'while' loop benchmark */whileloop(){	printf("start\n");	for (k = 0; k < 10000; k++) {		j = 1;		while (j <= 10)			j = j + 1;	}	printf("finish\007\n");}/* * 'do' loop benchmark */doloop(){	printf("start\n");	for (k = 0; k < 10000; k++) {		j = 1;		do {			j = j + 1;		}		while (j <= 10);	}	printf("finish\007\n");}/* * 'literalassign' benchmark */literalassign(){	printf("start\n");	for (k = 0; k < 10000; k++)		for (j = 0; j < 10; j++)			l = 0;	printf("finish\007\n");}/* * 'memoryaccess' loop benchmark */memoryaccess(){	printf("start\n");	for (k = 0; k < 10000; k++)		for (j = 0; j < 10; j++)			l = j;	printf("finish\007\n");}/* * 'arithmetic' benchmark */arithmetic(){	printf("start\n");	for (k = 0; k < 10000; k++)		x = k / 2 * 3 + 4 - 5;	printf("finish\007\n");}/* * 'algebra' benchmark */algebra(){	printf("start\n");	for (k = 1; k < 10001; k++)		x = k / k * k + k - k;	printf("finish\007\n");}/* * 'vector' benchmark */vector(){	printf("start\n");	matrix[0] = 0;	for (k = 0; k < 10000; k++)		for (j = 0; j < 10; j++)			matrix[j] = matrix[j - 1];	printf("finish\007\n");}/* * 'equalif' benchmark */equalif(){	printf("start\n");	for (k = 0; k < 10000; k++)		for (j = 0; j < 10; j++)			if (j < 6)				l = 1;			else				l = 0;	printf("finish\007\n");}/* * 'unequalif' benchmark */unequalif(){	printf("start\n");	for (k = 0; k < 10000; k++)		for (j = 0; j < 10; j++)			if (j < 2)				l = 1;			else				l = 0;	printf("finish\007\n");}/* * 'noparameter' benchmark */noparameter(){	printf("start\n");	j = 0;	for (k = 0; k < 10000; k++)		none1();	printf("finish\007\n");}none1(){	none2();}none2(){	none3();}none3(){	none4();}none4(){	none5();}none5(){	j = 1;}/* * 'value' benchmark */value(){	printf("start\n");	j = 0;	for (k = 0; k < 10000; k++)		value1(j);	printf("finish\007\n");}value1(i)int i;{	value2();}value2(i)int i;{	value3();}value3(i)int i;{	value4();}value4(i)int i;{	value5();}value5(i)int i;{	j = 1;}/* * 'reference' benchmark */reference(){	printf("start\n");	j = 0;	for (k = 0; k < 10000; k++)		refer1(&j);	printf("finish\007\n");}refer1(i)int *i;{	refer2(i);}refer2(i)int *i;{	refer3(i);}refer3(i)int *i;{	refer4(i);}refer4(i)int *i;{	refer5(i);}refer5(i)int *i;{	j = 1;}/* * 'tak' benchmark */dotak(){	printf("tak = %d\n", tak(18, 12, 6));}tak(x, y, z)int x, y, z;{	if (y < x)		return(tak(tak(x-1, y, z), tak(y-1, z, x), tak(z-1, x, y)));	else		return(z);}