1 #include "TimeMeasure.hh"
5 # pragma warning (disable: 4996)
16 TimeMeasure::TimeMeasure()
18 timerclear(&rtRealSum);
19 timerclear(&rtKernelSum);
21 timerclear(&rtActual);
30 _tscStart = _tscEnd = _tscTicks = 0;
33 _uiHiStart=_uiLoStart=_uiHiStop=_uiLoStop=0;
39 #ifdef WIN32 //Start and Stop not inlined for Win32
41 void TimeMeasure::Start() {
43 if(running) BIASERR(
"clock already started");
48 if ((rtLast.tv_usec=clock()) == -1)
49 BIASERR(
"error starting real timer "<<errno);
52 rtLast.tv_usec *= (int)(1E6/CLOCKS_PER_SEC);
54 _tscStart = BIAS::GetTSC();
56 # if _WIN32_WINNT >= 0x0501 // see winbase.h
57 GetSystemTimes(&_IdleTimeStart, &_KernelTimeStart, &_UserTimeStart);
58 # else //_WIN32_WINNT >= 0x0501
59 _IdleTimeStart.dwHighDateTime = 0;
60 _IdleTimeStart.dwLowDateTime = 0;
61 _KernelTimeStart.dwHighDateTime = 0;
62 _KernelTimeStart.dwLowDateTime = 0;
63 _UserTimeStart.dwHighDateTime = 0;
64 _UserTimeStart.dwLowDateTime = 0;
65 BIASWARN(
"You need at least WinXP/Server2003 to ge system times!");
66 # endif //_WIN32_WINNT >= 0x0501
69 void TimeMeasure::Stop() {
73 _tscEnd=BIAS::GetTSC();
78 if ((rtActual.tv_usec=clock()) == -1)
80 BIASERR(
"error stoping real timer "<<errno);
83 rtActual.tv_usec *= (int)(1E6/CLOCKS_PER_SEC);
85 # if _WIN32_WINNT >= 0x0501 // see winbase.h
86 GetSystemTimes(&_IdleTimeStop, &_KernelTimeStop, &_UserTimeStop);
87 # else //_WIN32_WINNT >= 0x0501
88 _IdleTimeStop.dwHighDateTime = 0;
89 _IdleTimeStop.dwLowDateTime = 0;
90 _KernelTimeStop.dwHighDateTime = 0;
91 _KernelTimeStop.dwLowDateTime = 0;
92 _UserTimeStop.dwHighDateTime = 0;
93 _UserTimeStop.dwLowDateTime = 0;
94 BIASWARN(
"You need at least WinXP/Server2003 to ge system times!");
95 # endif //_WIN32_WINNT >= 0x0501
97 FILETIME diffUserTime, diffKernelTime, diffIdleTime;
100 diffUserTime.dwHighDateTime =
101 _UserTimeStop.dwHighDateTime - _UserTimeStart.dwHighDateTime;
102 diffUserTime.dwLowDateTime =
103 _UserTimeStop.dwLowDateTime - _UserTimeStart.dwLowDateTime;
104 diffKernelTime.dwHighDateTime =
105 _KernelTimeStop.dwHighDateTime - _KernelTimeStart.dwHighDateTime;
106 diffKernelTime.dwLowDateTime =
107 _KernelTimeStop.dwLowDateTime - _KernelTimeStart.dwLowDateTime;
108 diffIdleTime.dwHighDateTime =
109 _IdleTimeStart.dwHighDateTime - _IdleTimeStart.dwHighDateTime;
110 diffIdleTime.dwLowDateTime =
111 _IdleTimeStart.dwLowDateTime - _IdleTimeStart.dwLowDateTime;
114 SYSTEMTIME userUTC, kernelUTC, idleUTC;
117 FileTimeToSystemTime(&diffUserTime, &userUTC);
118 FileTimeToSystemTime(&diffKernelTime, &kernelUTC);
119 FileTimeToSystemTime(&diffIdleTime, &idleUTC);
120 user += (userUTC.wMilliseconds + 1000 * userUTC.wSecond +
121 60*1000 * userUTC.wMinute + 60*60*1000*userUTC.wHour);
122 kernel += (kernelUTC.wMilliseconds + 1000 * kernelUTC.wSecond +
123 60*1000 * kernelUTC.wMinute + 60*60*1000*kernelUTC.wHour);
124 idle += (idleUTC.wMilliseconds + 1000 * idleUTC.wSecond +
125 60*1000 * idleUTC.wMinute + 60*60*1000*idleUTC.wHour);
127 rtRealSum.tv_sec += (rtActual.tv_usec - rtLast.tv_usec) / ((
int)1E6);
128 rtRealSum.tv_usec += (rtActual.tv_usec - rtLast.tv_usec) % ((
int)1E6);
131 _tscTicks = BIAS::GetTSCTicks(_tscStart, _tscEnd);
135 BIASERR(
"cannot stop clock befor starting it");
144 MSecondsToHumanReadable(
const unsigned long & msIN,
int & msecOUT,
145 int & seconds,
int & minutes,
int & hours,
146 int & days,
int & weeks)
148 unsigned long rest = msIN;
150 msecOUT = rest % 1000;
177 std::ostream & TimeMeasure::
178 PrintMsecHumanReadable(
const unsigned long msecIN, std::ostream &os)
180 int ms, sec, minutes, hh, dd, ww;
181 MSecondsToHumanReadable(msecIN, ms, sec, minutes, hh, dd, ww);
184 if (ww>0) display=
true;
185 if (display) os<<setw(3)<<ww<<
" weeks ";
187 if (hh>0) display=
true;
188 if (display) os<<setw(3)<<dd<<
" days ";
190 if (dd>0) display=
true;
191 if (display) os<<setw(3)<<hh<<
" hours ";
193 if (minutes>0) display=
true;
194 if (display) os<<setw(3)<<minutes<<
" minutes ";
196 if (sec>0) display=
true;
197 if (display) os<<setw(3)<<sec<<
" sec ";
201 os<<setw(3)<<ms<<
" msec";
204 os<<setw(3)<<ms<<
" msec";
210 std::string TimeMeasure::
211 GetCurrentTimeAsString(){
213 struct tm * timeinfo;
217 timeinfo = localtime ( &rawtime );
219 strftime (buffer,80,
"%X",timeinfo);
220 return string(buffer);
223 std::string TimeMeasure::
226 struct tm * timeinfo;
230 timeinfo = localtime ( &rawtime );
232 strftime (buffer,80,
"%x",timeinfo);
233 return string(buffer);
245 for (i = 0; i < 2; i++) {
249 result = GetCycleCount();
255 MeasureProcessorFrequency()
262 Sleep(sleeptime *1000);
267 rate = GetCycleCount() / (1e6*sleeptime);
273 PrintRealTime(std::ostream& os,
const bool &verbose)
const
277 <<GetRealTime()<<
" us ";
280 PrintMsecHumanReadable(
long(GetRealTime() /1000.0 ), os);
287 PrintUserTime(std::ostream& os,
const bool & verbose)
const
291 <<GetUserTime()<<
" ms ";
295 PrintMsecHumanReadable(
long(GetUserTime()), os);
302 PrintKernelTime(std::ostream& os,
const bool & verbose)
const
306 <<GetKernelTime()<<
" ms ";
309 PrintMsecHumanReadable(
long(GetKernelTime()), os);
316 PrintIdleTime(std::ostream& os,
const bool & verbose)
const
320 <<GetIdleTime()<<
" ms ";
323 PrintMsecHumanReadable(
long(GetIdleTime()), os);
330 PrintCycleCount(std::ostream& os)
const
334 <<GetCycleCount()<<std::endl;
340 TimerStream_.close();
345 SetTimerFile(
const std::string &file)
348 TimerStream_.open(file.c_str(), std::ios_base::app);
350 BIASERR(
"Can not open TimerFile "<<file
351 <<
" in TimeMeasure::SetTimerFile()")
352 perror(file.c_str());
358 LogToFileAndReset(
const std::string &comment)
361 if (!TimerStream_) BIASERR(
"TimerStream_ not open");
362 TimerStream_<<
"real: "<<std::setw(10)<<GetRealTime()/1e3
363 <<
"\tuser: "<<std::setw(6)<<GetUserTime()
364 <<
"\t"<<comment<<std::endl;
372 return (
double)(rtRealSum.tv_usec + (rtRealSum.tv_sec*1E6));
383 return (
double)user/(double)sysconf(_SC_CLK_TCK) * 1e3;
387 double TimeMeasure::GetKernelTime()
const
390 return (
double)kernel;
396 double TimeMeasure::GetIdleTime()
const
405 double TimeMeasure::GetFreq()
const
407 return 1E6/GetRealTime();
410 double TimeMeasure::GetUserFreq()
const
412 return 1E3/GetUserTime();
415 bool TimeMeasure::IsRunning()
const
421 double TimeMeasure::GetCycleCount()
const
425 BIASERR(
"you called GetCycleCount() while timer is running");
432 void TimeMeasure::Reset()
435 BIASERR(
"cannot reset running TimeMeasure");
438 _tscStart = _tscEnd = _tscTicks = 0;
443 _uiHiStart=_uiLoStart=_uiHiStop=_uiLoStop=0;
448 timerclear(&rtRealSum);
449 timerclear(&rtKernelSum);
455 void TimeMeasure::Print(std::ostream& os)
const
static std::ofstream TimerStream_