xref: /freebsd-src/contrib/sendmail/libsm/b-strcmp.c (revision ee7b0571c2c18bdec848ed2044223cc88db29bd8)
140266059SGregory Neil Shapiro /*
25dd76dd0SGregory Neil Shapiro  * Copyright (c) 2000-2001, 2004 Proofpoint, Inc. and its suppliers.
340266059SGregory Neil Shapiro  *      All rights reserved.
440266059SGregory Neil Shapiro  *
540266059SGregory Neil Shapiro  * By using this file, you agree to the terms and conditions set
640266059SGregory Neil Shapiro  * forth in the LICENSE file which can be found at the top level of
740266059SGregory Neil Shapiro  * the sendmail distribution.
840266059SGregory Neil Shapiro  */
940266059SGregory Neil Shapiro 
1040266059SGregory Neil Shapiro #include <sm/gen.h>
11*4313cc83SGregory Neil Shapiro SM_RCSID("@(#)$Id: b-strcmp.c,v 1.15 2013-11-22 20:51:42 ca Exp $")
1240266059SGregory Neil Shapiro #include <stdio.h>
1340266059SGregory Neil Shapiro #include <stdlib.h>
1440266059SGregory Neil Shapiro #include <unistd.h>
1540266059SGregory Neil Shapiro #include <sys/types.h>
164e4196cbSGregory Neil Shapiro #include <sm/time.h>
1740266059SGregory Neil Shapiro #include <sm/string.h>
1840266059SGregory Neil Shapiro 
1940266059SGregory Neil Shapiro #define toseconds(x, y)	(x.tv_sec - y.tv_sec)
2040266059SGregory Neil Shapiro #define SIZE	512
2140266059SGregory Neil Shapiro #define LOOPS	4000000L	/* initial number of loops */
2240266059SGregory Neil Shapiro #define MAXTIME	30L	/* "maximum" time to run single test */
2340266059SGregory Neil Shapiro 
24b6bacd31SGregory Neil Shapiro void fatal __P((char *));
25b6bacd31SGregory Neil Shapiro void purpose __P((void));
26b6bacd31SGregory Neil Shapiro int main __P((int, char *[]));
27b6bacd31SGregory Neil Shapiro 
2840266059SGregory Neil Shapiro void
fatal(str)2940266059SGregory Neil Shapiro fatal(str)
3040266059SGregory Neil Shapiro 	char *str;
3140266059SGregory Neil Shapiro {
3240266059SGregory Neil Shapiro 	perror(str);
3340266059SGregory Neil Shapiro 	exit(1);
3440266059SGregory Neil Shapiro }
3540266059SGregory Neil Shapiro 
3640266059SGregory Neil Shapiro void
purpose()3740266059SGregory Neil Shapiro purpose()
3840266059SGregory Neil Shapiro {
3940266059SGregory Neil Shapiro 	printf("This program benchmarks the performance differences between\n");
4040266059SGregory Neil Shapiro 	printf("strcasecmp() and sm_strcasecmp().\n");
4140266059SGregory Neil Shapiro 	printf("These tests may take several minutes to complete.\n");
4240266059SGregory Neil Shapiro }
4340266059SGregory Neil Shapiro 
4440266059SGregory Neil Shapiro int
main(argc,argv)4540266059SGregory Neil Shapiro main(argc, argv)
4640266059SGregory Neil Shapiro 	int argc;
4740266059SGregory Neil Shapiro 	char *argv[];
4840266059SGregory Neil Shapiro {
4940266059SGregory Neil Shapiro 	long a;
5040266059SGregory Neil Shapiro 	int k;
5140266059SGregory Neil Shapiro 	bool doit = false;
5240266059SGregory Neil Shapiro 	long loops;
5340266059SGregory Neil Shapiro 	long j;
5440266059SGregory Neil Shapiro 	long one, two;
5540266059SGregory Neil Shapiro 	struct timeval t1, t2;
5640266059SGregory Neil Shapiro 	char src1[SIZE], src2[SIZE];
5740266059SGregory Neil Shapiro 
5840266059SGregory Neil Shapiro # define OPTIONS	"d"
5940266059SGregory Neil Shapiro 	while ((k = getopt(argc, argv, OPTIONS)) != -1)
6040266059SGregory Neil Shapiro 	{
6140266059SGregory Neil Shapiro 		switch ((char) k)
6240266059SGregory Neil Shapiro 		{
6340266059SGregory Neil Shapiro 		  case 'd':
6440266059SGregory Neil Shapiro 			doit = true;
6540266059SGregory Neil Shapiro 			break;
6640266059SGregory Neil Shapiro 
6740266059SGregory Neil Shapiro 		  default:
6840266059SGregory Neil Shapiro 			break;
6940266059SGregory Neil Shapiro 		}
7040266059SGregory Neil Shapiro 	}
7140266059SGregory Neil Shapiro 
7240266059SGregory Neil Shapiro 	if (!doit)
7340266059SGregory Neil Shapiro 	{
7440266059SGregory Neil Shapiro 		purpose();
7540266059SGregory Neil Shapiro 		printf("If you want to run it, specify -d as option.\n");
7640266059SGregory Neil Shapiro 		return 0;
7740266059SGregory Neil Shapiro 	}
7840266059SGregory Neil Shapiro 
7940266059SGregory Neil Shapiro 	/* Run-time comments to the user */
8040266059SGregory Neil Shapiro 	purpose();
8140266059SGregory Neil Shapiro 	printf("\n");
8240266059SGregory Neil Shapiro 	for (k = 0; k < 3; k++)
8340266059SGregory Neil Shapiro 	{
8440266059SGregory Neil Shapiro 		switch (k)
8540266059SGregory Neil Shapiro 		{
8640266059SGregory Neil Shapiro 		  case 0:
8740266059SGregory Neil Shapiro 			(void) sm_strlcpy(src1, "1234567890", SIZE);
8840266059SGregory Neil Shapiro 			(void) sm_strlcpy(src2, "1234567890", SIZE);
8940266059SGregory Neil Shapiro 			break;
9040266059SGregory Neil Shapiro 		  case 1:
9140266059SGregory Neil Shapiro 			(void) sm_strlcpy(src1, "1234567890", SIZE);
9240266059SGregory Neil Shapiro 			(void) sm_strlcpy(src2, "1234567891", SIZE);
9340266059SGregory Neil Shapiro 			break;
9440266059SGregory Neil Shapiro 		  case 2:
9540266059SGregory Neil Shapiro 			(void) sm_strlcpy(src1, "1234567892", SIZE);
9640266059SGregory Neil Shapiro 			(void) sm_strlcpy(src2, "1234567891", SIZE);
9740266059SGregory Neil Shapiro 			break;
9840266059SGregory Neil Shapiro 		}
9940266059SGregory Neil Shapiro 		printf("Test %d: strcasecmp(%s, %s) versus sm_strcasecmp()\n",
10040266059SGregory Neil Shapiro 			k, src1, src2);
10140266059SGregory Neil Shapiro 		loops = LOOPS;
10240266059SGregory Neil Shapiro 		for (;;)
10340266059SGregory Neil Shapiro 		{
10440266059SGregory Neil Shapiro 			j = 0;
10540266059SGregory Neil Shapiro 			if (gettimeofday(&t1, NULL) < 0)
10640266059SGregory Neil Shapiro 				fatal("gettimeofday");
10740266059SGregory Neil Shapiro 			for (a = 0; a < loops; a++)
10840266059SGregory Neil Shapiro 				j += strcasecmp(src1, src2);
10940266059SGregory Neil Shapiro 			if (gettimeofday(&t2, NULL) < 0)
11040266059SGregory Neil Shapiro 				fatal("gettimeofday");
11140266059SGregory Neil Shapiro 			one = toseconds(t2, t1);
11240266059SGregory Neil Shapiro 			printf("\tstrcasecmp() result: %ld seconds [%ld]\n",
11340266059SGregory Neil Shapiro 				one, j);
11440266059SGregory Neil Shapiro 
11540266059SGregory Neil Shapiro 			j = 0;
11640266059SGregory Neil Shapiro 			if (gettimeofday(&t1, NULL) < 0)
11740266059SGregory Neil Shapiro 				fatal("gettimeofday");
11840266059SGregory Neil Shapiro 			for (a = 0; a < loops; a++)
11940266059SGregory Neil Shapiro 				j += sm_strcasecmp(src1, src2);
12040266059SGregory Neil Shapiro 			if (gettimeofday(&t2, NULL) < 0)
12140266059SGregory Neil Shapiro 				fatal("gettimeofday");
12240266059SGregory Neil Shapiro 			two = toseconds(t2, t1);
12340266059SGregory Neil Shapiro 			printf("\tsm_strcasecmp() result: %ld seconds [%ld]\n",
12440266059SGregory Neil Shapiro 				two, j);
12540266059SGregory Neil Shapiro 
12640266059SGregory Neil Shapiro 			if (abs(one - two) > 2)
12740266059SGregory Neil Shapiro 				break;
12840266059SGregory Neil Shapiro 			loops += loops;
12940266059SGregory Neil Shapiro 			if (loops < 0L || one > MAXTIME)
13040266059SGregory Neil Shapiro 			{
13140266059SGregory Neil Shapiro 				printf("\t\t** results too close: no decision\n");
13240266059SGregory Neil Shapiro 				break;
13340266059SGregory Neil Shapiro 			}
13440266059SGregory Neil Shapiro 			else
13540266059SGregory Neil Shapiro 			{
13640266059SGregory Neil Shapiro 				printf("\t\t** results too close redoing test %ld times **\n",
13740266059SGregory Neil Shapiro 					loops);
13840266059SGregory Neil Shapiro 			}
13940266059SGregory Neil Shapiro 		}
14040266059SGregory Neil Shapiro 	}
14140266059SGregory Neil Shapiro 
14240266059SGregory Neil Shapiro 	printf("\n\n");
14340266059SGregory Neil Shapiro 	printf("Interpreting the results:\n");
14440266059SGregory Neil Shapiro 	printf("\tFor differences larger than 2 seconds, the lower value is\n");
14540266059SGregory Neil Shapiro 	printf("\tbetter and that function should be used for performance\n");
14640266059SGregory Neil Shapiro 	printf("\treasons.\n\n");
14740266059SGregory Neil Shapiro 	printf("This program will re-run the tests when the difference is\n");
14840266059SGregory Neil Shapiro 	printf("less than 2 seconds.\n");
14940266059SGregory Neil Shapiro 	printf("The result will vary depending on the compiler optimization\n");	printf("level used. Compiling the sendmail libsm library with a\n");
15040266059SGregory Neil Shapiro 	printf("better optimization level can change the results.\n");
15140266059SGregory Neil Shapiro 	return 0;
15240266059SGregory Neil Shapiro }
153