Merge from vendor branch FILE:
[dragonfly.git] / contrib / sendmail / libsm / b-strcmp.c
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 }