xref: /freebsd/contrib/sendmail/libsm/b-strcmp.c (revision eacee0ff7ec955b32e09515246bd97b6edcd2b0f)
1 /*
2  * Copyright (c) 2000-2001 Sendmail, Inc. and its suppliers.
3  *      All rights reserved.
4  *
5  * By using this file, you agree to the terms and conditions set
6  * forth in the LICENSE file which can be found at the top level of
7  * the sendmail distribution.
8  */
9 
10 #include <sm/gen.h>
11 SM_RCSID("@(#)$Id: b-strcmp.c,v 1.12 2001/09/11 04:04:47 gshapiro Exp $")
12 #include <stdio.h>
13 #include <stdlib.h>
14 #include <unistd.h>
15 #include <sys/types.h>
16 #include <sys/time.h>
17 #include <sm/string.h>
18 
19 #define toseconds(x, y)	(x.tv_sec - y.tv_sec)
20 #define SIZE	512
21 #define LOOPS	4000000L	/* initial number of loops */
22 #define MAXTIME	30L	/* "maximum" time to run single test */
23 
24 void
25 fatal(str)
26 	char *str;
27 {
28 	perror(str);
29 	exit(1);
30 }
31 
32 void
33 purpose()
34 {
35 	printf("This program benchmarks the performance differences between\n");
36 	printf("strcasecmp() and sm_strcasecmp().\n");
37 	printf("These tests may take several minutes to complete.\n");
38 }
39 
40 int
41 main(argc, argv)
42 	int argc;
43 	char *argv[];
44 {
45 	long a;
46 	int k;
47 	bool doit = false;
48 	long loops;
49 	long j;
50 	long one, two;
51 	struct timeval t1, t2;
52 	char src1[SIZE], src2[SIZE];
53 
54 # define OPTIONS	"d"
55 	while ((k = getopt(argc, argv, OPTIONS)) != -1)
56 	{
57 		switch ((char) k)
58 		{
59 		  case 'd':
60 			doit = true;
61 			break;
62 
63 		  default:
64 			break;
65 		}
66 	}
67 
68 	if (!doit)
69 	{
70 		purpose();
71 		printf("If you want to run it, specify -d as option.\n");
72 		return 0;
73 	}
74 
75 	/* Run-time comments to the user */
76 	purpose();
77 	printf("\n");
78 	for (k = 0; k < 3; k++)
79 	{
80 		switch (k)
81 		{
82 		  case 0:
83 			(void) sm_strlcpy(src1, "1234567890", SIZE);
84 			(void) sm_strlcpy(src2, "1234567890", SIZE);
85 			break;
86 		  case 1:
87 			(void) sm_strlcpy(src1, "1234567890", SIZE);
88 			(void) sm_strlcpy(src2, "1234567891", SIZE);
89 			break;
90 		  case 2:
91 			(void) sm_strlcpy(src1, "1234567892", SIZE);
92 			(void) sm_strlcpy(src2, "1234567891", SIZE);
93 			break;
94 		}
95 		printf("Test %d: strcasecmp(%s, %s) versus sm_strcasecmp()\n",
96 			k, src1, src2);
97 		loops = LOOPS;
98 		for (;;)
99 		{
100 			j = 0;
101 			if (gettimeofday(&t1, NULL) < 0)
102 				fatal("gettimeofday");
103 			for (a = 0; a < loops; a++)
104 				j += strcasecmp(src1, src2);
105 			if (gettimeofday(&t2, NULL) < 0)
106 				fatal("gettimeofday");
107 			one = toseconds(t2, t1);
108 			printf("\tstrcasecmp() result: %ld seconds [%ld]\n",
109 				one, j);
110 
111 			j = 0;
112 			if (gettimeofday(&t1, NULL) < 0)
113 				fatal("gettimeofday");
114 			for (a = 0; a < loops; a++)
115 				j += sm_strcasecmp(src1, src2);
116 			if (gettimeofday(&t2, NULL) < 0)
117 				fatal("gettimeofday");
118 			two = toseconds(t2, t1);
119 			printf("\tsm_strcasecmp() result: %ld seconds [%ld]\n",
120 				two, j);
121 
122 			if (abs(one - two) > 2)
123 				break;
124 			loops += loops;
125 			if (loops < 0L || one > MAXTIME)
126 			{
127 				printf("\t\t** results too close: no decision\n");
128 				break;
129 			}
130 			else
131 			{
132 				printf("\t\t** results too close redoing test %ld times **\n",
133 					loops);
134 			}
135 		}
136 	}
137 
138 	printf("\n\n");
139 	printf("Interpreting the results:\n");
140 	printf("\tFor differences larger than 2 seconds, the lower value is\n");
141 	printf("\tbetter and that function should be used for performance\n");
142 	printf("\treasons.\n\n");
143 	printf("This program will re-run the tests when the difference is\n");
144 	printf("less than 2 seconds.\n");
145 	printf("The result will vary depending on the compiler optimization\n");	printf("level used. Compiling the sendmail libsm library with a\n");
146 	printf("better optimization level can change the results.\n");
147 	return 0;
148 }
149