source: trunk/third/sendmail/libsm/b-strcmp.c @ 19204

Revision 19204, 3.3 KB checked in by zacheiss, 22 years ago (diff)
This commit was generated by cvs2svn to compensate for changes in r19203, which included commits to RCS files with non-trunk default branches.
Line 
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>
11SM_RCSID("@(#)$Id: b-strcmp.c,v 1.1.1.1 2003-04-08 15:06:03 zacheiss 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
24void
25fatal(str)
26        char *str;
27{
28        perror(str);
29        exit(1);
30}
31
32void
33purpose()
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
40int
41main(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}
Note: See TracBrowser for help on using the repository browser.