diff options
Diffstat (limited to 'contrib/sendmail/libsm/b-strcmp.c')
-rw-r--r-- | contrib/sendmail/libsm/b-strcmp.c | 152 |
1 files changed, 152 insertions, 0 deletions
diff --git a/contrib/sendmail/libsm/b-strcmp.c b/contrib/sendmail/libsm/b-strcmp.c new file mode 100644 index 0000000..c7dcb88 --- /dev/null +++ b/contrib/sendmail/libsm/b-strcmp.c @@ -0,0 +1,152 @@ +/* + * Copyright (c) 2000-2001, 2004 Sendmail, Inc. and its suppliers. + * All rights reserved. + * + * By using this file, you agree to the terms and conditions set + * forth in the LICENSE file which can be found at the top level of + * the sendmail distribution. + */ + +#include <sm/gen.h> +SM_RCSID("@(#)$Id: b-strcmp.c,v 1.14 2005/06/14 23:07:20 ca Exp $") +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <sys/types.h> +#include <sm/time.h> +#include <sm/string.h> + +#define toseconds(x, y) (x.tv_sec - y.tv_sec) +#define SIZE 512 +#define LOOPS 4000000L /* initial number of loops */ +#define MAXTIME 30L /* "maximum" time to run single test */ + +void fatal __P((char *)); +void purpose __P((void)); +int main __P((int, char *[])); + +void +fatal(str) + char *str; +{ + perror(str); + exit(1); +} + +void +purpose() +{ + printf("This program benchmarks the performance differences between\n"); + printf("strcasecmp() and sm_strcasecmp().\n"); + printf("These tests may take several minutes to complete.\n"); +} + +int +main(argc, argv) + int argc; + char *argv[]; +{ + long a; + int k; + bool doit = false; + long loops; + long j; + long one, two; + struct timeval t1, t2; + char src1[SIZE], src2[SIZE]; + +# define OPTIONS "d" + while ((k = getopt(argc, argv, OPTIONS)) != -1) + { + switch ((char) k) + { + case 'd': + doit = true; + break; + + default: + break; + } + } + + if (!doit) + { + purpose(); + printf("If you want to run it, specify -d as option.\n"); + return 0; + } + + /* Run-time comments to the user */ + purpose(); + printf("\n"); + for (k = 0; k < 3; k++) + { + switch (k) + { + case 0: + (void) sm_strlcpy(src1, "1234567890", SIZE); + (void) sm_strlcpy(src2, "1234567890", SIZE); + break; + case 1: + (void) sm_strlcpy(src1, "1234567890", SIZE); + (void) sm_strlcpy(src2, "1234567891", SIZE); + break; + case 2: + (void) sm_strlcpy(src1, "1234567892", SIZE); + (void) sm_strlcpy(src2, "1234567891", SIZE); + break; + } + printf("Test %d: strcasecmp(%s, %s) versus sm_strcasecmp()\n", + k, src1, src2); + loops = LOOPS; + for (;;) + { + j = 0; + if (gettimeofday(&t1, NULL) < 0) + fatal("gettimeofday"); + for (a = 0; a < loops; a++) + j += strcasecmp(src1, src2); + if (gettimeofday(&t2, NULL) < 0) + fatal("gettimeofday"); + one = toseconds(t2, t1); + printf("\tstrcasecmp() result: %ld seconds [%ld]\n", + one, j); + + j = 0; + if (gettimeofday(&t1, NULL) < 0) + fatal("gettimeofday"); + for (a = 0; a < loops; a++) + j += sm_strcasecmp(src1, src2); + if (gettimeofday(&t2, NULL) < 0) + fatal("gettimeofday"); + two = toseconds(t2, t1); + printf("\tsm_strcasecmp() result: %ld seconds [%ld]\n", + two, j); + + if (abs(one - two) > 2) + break; + loops += loops; + if (loops < 0L || one > MAXTIME) + { + printf("\t\t** results too close: no decision\n"); + break; + } + else + { + printf("\t\t** results too close redoing test %ld times **\n", + loops); + } + } + } + + printf("\n\n"); + printf("Interpreting the results:\n"); + printf("\tFor differences larger than 2 seconds, the lower value is\n"); + printf("\tbetter and that function should be used for performance\n"); + printf("\treasons.\n\n"); + printf("This program will re-run the tests when the difference is\n"); + printf("less than 2 seconds.\n"); + printf("The result will vary depending on the compiler optimization\n"); printf("level used. Compiling the sendmail libsm library with a\n"); + printf("better optimization level can change the results.\n"); + return 0; +} |