# HG changeset patch
# User Balazs Dezso <deba@inf.elte.hu>
# Date 1208162801 -7200
# Node ID 5b9af841a7ec4152a6aae0b7d566a18c900e5ee0
# Parent ae7785fe84315de6be35a182420b6369e851f00d
MinGW compatible time measure
diff -r ae7785fe8431 -r 5b9af841a7ec lemon/time_measure.h
|
a
|
b
|
|
| 23 | 23 | ///\file |
| 24 | 24 | ///\brief Tools for measuring cpu usage |
| 25 | 25 | |
| | 26 | #ifdef WIN32 |
| | 27 | #include <windows.h> |
| | 28 | #include <cmath> |
| | 29 | #else |
| 26 | 30 | #include <sys/times.h> |
| | 31 | #include <sys/time.h> |
| | 32 | #endif |
| 27 | 33 | |
| 28 | | #include <sys/time.h> |
| 29 | 34 | #include <fstream> |
| 30 | 35 | #include <iostream> |
| 31 | | #include <unistd.h> |
| 32 | 36 | |
| 33 | 37 | namespace lemon { |
| 34 | 38 | |
| … |
… |
namespace lemon { |
| 54 | 58 | |
| 55 | 59 | class TimeStamp |
| 56 | 60 | { |
| 57 | | struct rtms |
| 58 | | { |
| 59 | | double tms_utime; |
| 60 | | double tms_stime; |
| 61 | | double tms_cutime; |
| 62 | | double tms_cstime; |
| 63 | | rtms() {} |
| 64 | | rtms(tms ts) : tms_utime(ts.tms_utime), tms_stime(ts.tms_stime), |
| 65 | | tms_cutime(ts.tms_cutime), tms_cstime(ts.tms_cstime) {} |
| 66 | | }; |
| 67 | | rtms ts; |
| 68 | | double real_time; |
| | 61 | double utime; |
| | 62 | double stime; |
| | 63 | double cutime; |
| | 64 | double cstime; |
| | 65 | double rtime; |
| 69 | 66 | |
| 70 | | rtms &getTms() {return ts;} |
| 71 | | const rtms &getTms() const {return ts;} |
| 72 | | |
| 73 | 67 | void _reset() { |
| 74 | | ts.tms_utime = ts.tms_stime = ts.tms_cutime = ts.tms_cstime = 0; |
| 75 | | real_time = 0; |
| | 68 | utime = stime = cutime = cstime = rtime = 0; |
| 76 | 69 | } |
| 77 | 70 | |
| 78 | 71 | public: |
| … |
… |
namespace lemon { |
| 80 | 73 | ///Read the current time values of the process |
| 81 | 74 | void stamp() |
| 82 | 75 | { |
| | 76 | #ifndef WIN32 |
| 83 | 77 | timeval tv; |
| 84 | | tms _ts; |
| 85 | | times(&_ts); |
| 86 | | gettimeofday(&tv, 0);real_time=tv.tv_sec+double(tv.tv_usec)/1e6; |
| 87 | | ts=_ts; |
| | 78 | gettimeofday(&tv, 0); |
| | 79 | rtime=tv.tv_sec+double(tv.tv_usec)/1e6; |
| | 80 | |
| | 81 | tms ts; |
| | 82 | double tck=sysconf(_SC_CLK_TCK); |
| | 83 | times(&ts); |
| | 84 | utime=ts.tms_utime/tck; |
| | 85 | stime=ts.tms_stime/tck; |
| | 86 | cutime=ts.tms_cutime/tck; |
| | 87 | cstime=ts.tms_cstime/tck; |
| | 88 | #else |
| | 89 | static const double ch = 4294967296.0e-7; |
| | 90 | static const double cl = 1.0e-7; |
| | 91 | |
| | 92 | FILETIME system; |
| | 93 | GetSystemTimeAsFileTime(&system); |
| | 94 | rtime = ch * system.dwHighDateTime + cl * system.dwLowDateTime; |
| | 95 | |
| | 96 | FILETIME create, exit, kernel, user; |
| | 97 | if (GetProcessTimes(GetCurrentProcess(),&create, &exit, &kernel, &user)) { |
| | 98 | utime = ch * user.dwHighDateTime + cl * user.dwLowDateTime; |
| | 99 | stime = ch * kernel.dwHighDateTime + cl * kernel.dwLowDateTime; |
| | 100 | cutime = 0; |
| | 101 | cstime = 0; |
| | 102 | } else { |
| | 103 | rtime = 0; |
| | 104 | utime = 0; |
| | 105 | stime = 0; |
| | 106 | cutime = 0; |
| | 107 | cstime = 0; |
| | 108 | } |
| | 109 | #endif |
| 88 | 110 | } |
| 89 | 111 | |
| 90 | 112 | /// Constructor initializing with zero |
| … |
… |
namespace lemon { |
| 99 | 121 | ///\e |
| 100 | 122 | TimeStamp &operator+=(const TimeStamp &b) |
| 101 | 123 | { |
| 102 | | ts.tms_utime+=b.ts.tms_utime; |
| 103 | | ts.tms_stime+=b.ts.tms_stime; |
| 104 | | ts.tms_cutime+=b.ts.tms_cutime; |
| 105 | | ts.tms_cstime+=b.ts.tms_cstime; |
| 106 | | real_time+=b.real_time; |
| | 124 | utime+=b.utime; |
| | 125 | stime+=b.stime; |
| | 126 | cutime+=b.cutime; |
| | 127 | cstime+=b.cstime; |
| | 128 | rtime+=b.rtime; |
| 107 | 129 | return *this; |
| 108 | 130 | } |
| 109 | 131 | ///\e |
| … |
… |
namespace lemon { |
| 115 | 137 | ///\e |
| 116 | 138 | TimeStamp &operator-=(const TimeStamp &b) |
| 117 | 139 | { |
| 118 | | ts.tms_utime-=b.ts.tms_utime; |
| 119 | | ts.tms_stime-=b.ts.tms_stime; |
| 120 | | ts.tms_cutime-=b.ts.tms_cutime; |
| 121 | | ts.tms_cstime-=b.ts.tms_cstime; |
| 122 | | real_time-=b.real_time; |
| | 140 | utime-=b.utime; |
| | 141 | stime-=b.stime; |
| | 142 | cutime-=b.cutime; |
| | 143 | cstime-=b.cstime; |
| | 144 | rtime-=b.rtime; |
| 123 | 145 | return *this; |
| 124 | 146 | } |
| 125 | 147 | ///\e |
| … |
… |
namespace lemon { |
| 131 | 153 | ///\e |
| 132 | 154 | TimeStamp &operator*=(double b) |
| 133 | 155 | { |
| 134 | | ts.tms_utime*=b; |
| 135 | | ts.tms_stime*=b; |
| 136 | | ts.tms_cutime*=b; |
| 137 | | ts.tms_cstime*=b; |
| 138 | | real_time*=b; |
| | 156 | utime*=b; |
| | 157 | stime*=b; |
| | 158 | cutime*=b; |
| | 159 | cstime*=b; |
| | 160 | rtime*=b; |
| 139 | 161 | return *this; |
| 140 | 162 | } |
| 141 | 163 | ///\e |
| … |
… |
namespace lemon { |
| 148 | 170 | ///\e |
| 149 | 171 | TimeStamp &operator/=(double b) |
| 150 | 172 | { |
| 151 | | ts.tms_utime/=b; |
| 152 | | ts.tms_stime/=b; |
| 153 | | ts.tms_cutime/=b; |
| 154 | | ts.tms_cstime/=b; |
| 155 | | real_time/=b; |
| | 173 | utime/=b; |
| | 174 | stime/=b; |
| | 175 | cutime/=b; |
| | 176 | cstime/=b; |
| | 177 | rtime/=b; |
| 156 | 178 | return *this; |
| 157 | 179 | } |
| 158 | 180 | ///\e |
| … |
… |
namespace lemon { |
| 173 | 195 | ///Gives back the user time of the process |
| 174 | 196 | double userTime() const |
| 175 | 197 | { |
| 176 | | return double(ts.tms_utime)/sysconf(_SC_CLK_TCK); |
| | 198 | return utime; |
| 177 | 199 | } |
| 178 | 200 | ///Gives back the system time of the process |
| 179 | 201 | double systemTime() const |
| 180 | 202 | { |
| 181 | | return double(ts.tms_stime)/sysconf(_SC_CLK_TCK); |
| | 203 | return stime; |
| 182 | 204 | } |
| 183 | 205 | ///Gives back the user time of the process' children |
| | 206 | |
| | 207 | ///\note On <tt>WIN32</tt> platform this value is not calculated. |
| | 208 | /// |
| 184 | 209 | double cUserTime() const |
| 185 | 210 | { |
| 186 | | return double(ts.tms_cutime)/sysconf(_SC_CLK_TCK); |
| | 211 | return cutime; |
| 187 | 212 | } |
| 188 | 213 | ///Gives back the user time of the process' children |
| | 214 | |
| | 215 | ///\note On <tt>WIN32</tt> platform this value is not calculated. |
| | 216 | /// |
| 189 | 217 | double cSystemTime() const |
| 190 | 218 | { |
| 191 | | return double(ts.tms_cstime)/sysconf(_SC_CLK_TCK); |
| | 219 | return cstime; |
| 192 | 220 | } |
| 193 | 221 | ///Gives back the real time |
| 194 | | double realTime() const {return real_time;} |
| | 222 | double realTime() const {return rtime;} |
| 195 | 223 | }; |
| 196 | 224 | |
| 197 | 225 | TimeStamp operator*(double b,const TimeStamp &t) |
| … |
… |
namespace lemon { |
| 212 | 240 | /// \li \c cs: system cpu time of children, |
| 213 | 241 | /// \li \c real: real time. |
| 214 | 242 | /// \relates TimeStamp |
| | 243 | /// \note On <tt>WIN32</tt> platform the cummulative values are not |
| | 244 | /// calculated. |
| 215 | 245 | inline std::ostream& operator<<(std::ostream& os,const TimeStamp &t) |
| 216 | 246 | { |
| 217 | | long cls = sysconf(_SC_CLK_TCK); |
| 218 | | os << "u: " << double(t.getTms().tms_utime)/cls << |
| 219 | | "s, s: " << double(t.getTms().tms_stime)/cls << |
| 220 | | "s, cu: " << double(t.getTms().tms_cutime)/cls << |
| 221 | | "s, cs: " << double(t.getTms().tms_cstime)/cls << |
| | 247 | os << "u: " << t.userTime() << |
| | 248 | "s, s: " << t.systemTime() << |
| | 249 | "s, cu: " << t.cUserTime() << |
| | 250 | "s, cs: " << t.cSystemTime() << |
| 222 | 251 | "s, real: " << t.realTime() << "s"; |
| 223 | 252 | return os; |
| 224 | 253 | } |
| … |
… |
namespace lemon { |
| 404 | 433 | return operator TimeStamp().systemTime(); |
| 405 | 434 | } |
| 406 | 435 | ///Gives back the ellapsed user time of the process' children |
| | 436 | |
| | 437 | ///\note On <tt>WIN32</tt> platform this value is not calculated. |
| | 438 | /// |
| 407 | 439 | double cUserTime() const |
| 408 | 440 | { |
| 409 | 441 | return operator TimeStamp().cUserTime(); |
| 410 | 442 | } |
| 411 | 443 | ///Gives back the ellapsed user time of the process' children |
| | 444 | |
| | 445 | ///\note On <tt>WIN32</tt> platform this value is not calculated. |
| | 446 | /// |
| 412 | 447 | double cSystemTime() const |
| 413 | 448 | { |
| 414 | 449 | return operator TimeStamp().cSystemTime(); |