time.c (3635B)
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 2 /* This Source Code Form is subject to the terms of the Mozilla Public 3 * License, v. 2.0. If a copy of the MPL was not distributed with this 4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 5 6 /* 7 * Program to test different ways to get the time; right now it is tuned 8 * only for solaris. 9 * solaris results (100000 iterations): 10 * time to get time with time(): 4.63 usec avg, 463 msec total 11 * time to get time with gethrtime(): 2.17 usec avg, 217 msec total 12 * time to get time with gettimeofday(): 1.25 usec avg, 125 msec total 13 * 14 * 15 */ 16 /*********************************************************************** 17 ** Includes 18 ***********************************************************************/ 19 /* Used to get the command line option */ 20 #include "plgetopt.h" 21 22 #include "nspr.h" 23 #include "prpriv.h" 24 #include "prinrval.h" 25 26 #include <stdio.h> 27 #include <stdlib.h> 28 #include <string.h> 29 #include <sys/time.h> 30 31 #define DEFAULT_COUNT 100000 32 PRInt32 count; 33 34 time_t itime; 35 hrtime_t ihrtime; 36 37 void ftime_init() { 38 itime = time(NULL); 39 ihrtime = gethrtime(); 40 } 41 42 time_t ftime() { 43 hrtime_t now = gethrtime(); 44 45 return itime + ((now - ihrtime) / 1000000000ll); 46 } 47 48 static void timeTime(void) { 49 PRInt32 index = count; 50 time_t rv; 51 52 for (; index--;) { 53 rv = time(NULL); 54 } 55 } 56 57 static void timeGethrtime(void) { 58 PRInt32 index = count; 59 time_t rv; 60 61 for (; index--;) { 62 rv = ftime(); 63 } 64 } 65 66 static void timeGettimeofday(void) { 67 PRInt32 index = count; 68 time_t rv; 69 struct timeval tp; 70 71 for (; index--;) { 72 rv = gettimeofday(&tp, NULL); 73 } 74 } 75 76 static void timePRTime32(void) { 77 PRInt32 index = count; 78 PRInt32 rv32; 79 PRTime q; 80 PRTime rv; 81 82 LL_I2L(q, 1000000); 83 84 for (; index--;) { 85 rv = PR_Now(); 86 LL_DIV(rv, rv, q); 87 LL_L2I(rv32, rv); 88 } 89 } 90 91 static void timePRTime64(void) { 92 PRInt32 index = count; 93 PRTime rv; 94 95 for (; index--;) { 96 rv = PR_Now(); 97 } 98 } 99 100 /************************************************************************/ 101 102 static void Measure(void (*func)(void), const char* msg) { 103 PRIntervalTime start, stop; 104 double d; 105 PRInt32 tot; 106 107 start = PR_IntervalNow(); 108 (*func)(); 109 stop = PR_IntervalNow(); 110 111 d = (double)PR_IntervalToMicroseconds(stop - start); 112 tot = PR_IntervalToMilliseconds(stop - start); 113 114 if (debug_mode) { 115 printf("%40s: %6.2f usec avg, %d msec total\n", msg, d / count, tot); 116 } 117 } 118 119 int main(int argc, char** argv) { 120 /* The command line argument: -d is used to determine if the test is being run 121 in debug mode. The regress tool requires only one line output:PASS or FAIL. 122 All of the printfs associated with this test has been handled with a if 123 (debug_mode) test. Usage: test_name -d 124 */ 125 PLOptStatus os; 126 PLOptState* opt = PL_CreateOptState(argc, argv, "d:"); 127 while (PL_OPT_EOL != (os = PL_GetNextOpt(opt))) { 128 if (PL_OPT_BAD == os) { 129 continue; 130 } 131 switch (opt->option) { 132 case 'd': /* debug mode */ 133 debug_mode = 1; 134 break; 135 default: 136 break; 137 } 138 } 139 PL_DestroyOptState(opt); 140 141 PR_Init(PR_USER_THREAD, PR_PRIORITY_NORMAL, 0); 142 143 if (argc > 1) { 144 count = atoi(argv[1]); 145 } else { 146 count = DEFAULT_COUNT; 147 } 148 149 ftime_init(); 150 151 Measure(timeTime, "time to get time with time()"); 152 Measure(timeGethrtime, "time to get time with gethrtime()"); 153 Measure(timeGettimeofday, "time to get time with gettimeofday()"); 154 Measure(timePRTime32, "time to get time with PR_Time() (32bit)"); 155 Measure(timePRTime64, "time to get time with PR_Time() (64bit)"); 156 157 PR_Cleanup(); 158 return 0; 159 }