BIE |
/home/weinberg/src/BIE/include/Timer.h00001 #ifndef _TIMER_H 00002 #define _TIMER_H 00003 00004 #include <stdlib.h> 00005 #include <time.h> 00006 #include <sys/types.h> 00007 #include <sys/time.h> 00008 #include <sys/resource.h> 00009 00010 #include <iostream> 00011 00013 class TimeElapsed 00014 { 00015 private: 00016 long userTime, systemTime, realTime; 00017 00018 public: 00020 TimeElapsed(long user, long system, long real) 00021 { 00022 userTime = user; 00023 systemTime = system; 00024 realTime = real; 00025 } 00026 00028 long getUserTime() 00029 { 00030 return userTime; 00031 } 00032 00034 long getSystemTime() 00035 { 00036 return systemTime; 00037 } 00038 00040 long getTotalTime() 00041 { 00042 return userTime + systemTime; 00043 } 00044 00045 00047 long getRealTime() 00048 { 00049 return realTime; 00050 } 00051 }; 00052 00054 class Timer 00055 { 00056 private: 00057 timeval begin, end; 00058 struct rusage beginusage, endusage; 00059 // the time counted so far 00060 long utime, stime, rtime; 00061 00062 // indicate whether the timer has been started 00063 bool started; 00064 00065 // if true then return number of microseconds 00066 // for user and system time; 00067 // else return number of seconds. 00068 bool precision; 00069 00070 public: 00073 Timer(bool precision = false) 00074 { 00075 utime = stime = rtime = 0; 00076 started = false; 00077 this->precision = precision; 00078 } 00079 00081 void Seconds() { precision = false; } 00082 00084 void Microseconds() { precision = true; } 00085 00087 bool Precision() { return precision; } 00088 00090 void start() 00091 { 00092 if (started) 00093 return; 00094 started = true; 00095 00096 if (gettimeofday(&begin, NULL)) 00097 cerr << "gettimeofday error!"; 00098 00099 if (getrusage(RUSAGE_SELF, &beginusage) == -1) 00100 cerr << "getrusage error!"; 00101 } 00102 00105 TimeElapsed stop() 00106 { 00107 if (!started) 00108 return TimeElapsed(0, 0, 0); 00109 00110 if (gettimeofday(&end, NULL)) 00111 cerr << "gettimeofday error!"; 00112 00113 if (getrusage(RUSAGE_SELF, &endusage) == -1) 00114 cerr << "getrusage error!"; 00115 00116 started = false; 00117 00118 if (precision) 00119 { 00120 long uusecs = (endusage.ru_utime.tv_sec 00121 - beginusage.ru_utime.tv_sec) * 1000000 00122 + endusage.ru_utime.tv_usec - beginusage.ru_utime.tv_usec; 00123 utime += uusecs; 00124 00125 long susecs = (endusage.ru_stime.tv_sec 00126 - beginusage.ru_stime.tv_sec) * 1000000 00127 + endusage.ru_stime.tv_usec - beginusage.ru_stime.tv_usec; 00128 stime += susecs; 00129 00130 long rusecs = (end.tv_sec - begin.tv_sec) * 1000000 00131 + end.tv_usec - begin.tv_usec; 00132 rtime += rusecs; 00133 } 00134 else 00135 { 00136 long usecs = (endusage.ru_utime.tv_sec 00137 - beginusage.ru_utime.tv_sec); 00138 utime += usecs; 00139 00140 long ssecs = (endusage.ru_stime.tv_sec 00141 - beginusage.ru_stime.tv_sec); 00142 stime += ssecs; 00143 00144 long rsecs = end.tv_sec - begin.tv_sec 00145 + (end.tv_usec - begin.tv_usec)/1000000; 00146 rtime += rsecs; 00147 } 00148 00149 return TimeElapsed(utime, stime, rtime); 00150 } 00151 00154 void reset() 00155 { 00156 utime = stime = rtime = 0; 00157 00158 if (started) 00159 { 00160 if (gettimeofday(&begin, NULL)) 00161 cerr << "gettimeofday error!"; 00162 00163 if (getrusage(RUSAGE_SELF, &beginusage) == -1) 00164 cerr << "getrusage error!"; 00165 } 00166 } 00167 00169 TimeElapsed getTime() 00170 { 00171 if (!started) 00172 return TimeElapsed(utime, stime, rtime); 00173 00174 if (gettimeofday(&end, NULL)) 00175 cerr << "gettimeofday error!"; 00176 00177 if (getrusage(RUSAGE_SELF, &endusage) == -1) 00178 cerr << "getrusage error!"; 00179 00180 if (precision) 00181 { 00182 long uusecs = (endusage.ru_utime.tv_sec 00183 - beginusage.ru_utime.tv_sec) * 1000000 00184 + endusage.ru_utime.tv_usec - beginusage.ru_utime.tv_usec; 00185 00186 long susecs = (endusage.ru_stime.tv_sec 00187 - beginusage.ru_stime.tv_sec) * 1000000 00188 + endusage.ru_stime.tv_usec - beginusage.ru_stime.tv_usec; 00189 00190 long rusecs = (end.tv_sec - begin.tv_sec) * 1000000 00191 + end.tv_usec - begin.tv_usec; 00192 00193 return TimeElapsed(utime + uusecs, 00194 stime + susecs, 00195 rtime + rusecs); 00196 } 00197 else 00198 { 00199 long usecs = (endusage.ru_utime.tv_sec 00200 - beginusage.ru_utime.tv_sec); 00201 00202 long ssecs = (endusage.ru_stime.tv_sec 00203 - beginusage.ru_stime.tv_sec); 00204 00205 long rsecs = end.tv_sec - begin.tv_sec 00206 + (end.tv_usec - begin.tv_usec)/1000000; 00207 00208 return TimeElapsed(utime + usecs, 00209 stime + ssecs, 00210 rtime + rsecs); 00211 } 00212 } 00213 00215 bool isStarted() 00216 { 00217 return started; 00218 } 00219 }; 00220 00221 #endif // _TIMER_H Send suggestions, questions, and feedback to WEINBERG at ASTRO dot UMASS dot EDU. Documentation generated at Fri Mar 26 00:35:11 2010 by
|