44#ifndef DOXY_IGNORE_THIS
47#if defined(OM_CC_MIPS)
74 virtual ~TimerImpl() { ; }
76 virtual void reset(
void) = 0;
77 virtual void start(
void) = 0;
78 virtual void stop(
void) = 0;
79 virtual void cont(
void) = 0;
80 virtual double seconds(
void)
const = 0;
86#if defined(WIN32) && (defined(_MSC_VER) || defined(__INTEL_COMPILER) || defined (__MINGW32__) )
88#ifndef DOXY_IGNORE_THIS
92class TimerImplWin32 :
public TimerImpl
100 TimerImplWin32(
void);
101 ~TimerImplWin32(
void) { ; }
103 virtual void reset(
void)
override;
104 virtual void start(
void)
override;
105 virtual void stop(
void)
override;
106 virtual void cont(
void)
override;
107 virtual double seconds(
void)
const override;
110TimerImplWin32::TimerImplWin32(
void)
112 if (QueryPerformanceFrequency(&freq_)==FALSE)
113 throw std::runtime_error(
"Performance counter of of stock!");
115 memset(&count_,0,
sizeof(count_));
116 memset(&start_,0,
sizeof(count_));
119void TimerImplWin32::reset(
void)
121 memset(&count_,0,
sizeof(count_));
122 memset(&start_,0,
sizeof(count_));
125void TimerImplWin32::start(
void)
128 QueryPerformanceCounter(&start_);
131void TimerImplWin32::stop(
void)
135 QueryPerformanceCounter(&stop_);
136 count_.QuadPart += stop_.QuadPart - start_.QuadPart;
139void TimerImplWin32::cont(
void)
141 QueryPerformanceCounter(&start_);
144double TimerImplWin32::seconds(
void)
const
146 return (
double)count_.QuadPart/(double)freq_.QuadPart;
150#elif defined(__GNUC__) && defined(__POSIX__)
152#ifndef DOXY_IGNORE_THIS
156template <clock
id_t N>
157class TimerImplPosix :
public TimerImpl
160 TimerImplPosix() : id_(N), seconds_(0.0)
166 virtual void reset(
void)
override { seconds_ = 0.0; }
168 virtual void start(
void)
override { seconds_ = 0.0; clock_gettime( id_, &start_ ); }
169 virtual void stop(
void)
override
172 clock_gettime( id_, &stop );
173 seconds_ += ( stop.tv_sec - start_.tv_sec );
174 seconds_ += ( (double(stop.tv_nsec-start_.tv_nsec)*1e-9) );
177 virtual void cont(
void)
override { clock_gettime( id_, &start_ ); }
179 virtual double seconds()
override const {
return seconds_; }
188#elif (defined(__GNUC__) && !defined(__FreeBSD__) || (defined(__INTEL_COMPILER) && !defined(WIN32))) && !defined(__MINGW32__)
190# include <sys/time.h>
191# include <sys/resource.h>
194class TimerImplGToD:
public TimerImpl
197 TimerImplGToD() : seconds_(0.0)
203 virtual void reset(
void)
override { seconds_ = 0.0; }
204 virtual void start(
void)
override { seconds_ = 0.0; gettimeofday( &start_, &tz_ ); }
206 virtual void stop(
void)
override
208 gettimeofday( &stop_, &tz_ );
210 seconds_ += (double)(stop_.tv_sec - start_.tv_sec);
211 seconds_ += (double)(stop_.tv_usec- start_.tv_usec)*1e-6;
214 virtual void cont(
void)
override { gettimeofday( &start_, &tz_); }
216 virtual double seconds()
const override {
return seconds_; }
220 struct timeval start_, stop_;
231static const unsigned long clockticks = CLOCKS_PER_SEC;
233class TimerImplStd :
public TimerImpl
236 TimerImplStd() : freq_(clockticks),count_(0),start_(0) { }
237 ~TimerImplStd() { ; }
239 virtual void reset(
void)
override { count_ = 0; }
240 virtual void start(
void)
override { count_ = 0; start_ = clock(); }
241 virtual void stop(
void)
override;
242 virtual void cont(
void)
override { start_ = clock(); }
243 virtual double seconds(
void)
const override {
return (
double)count_/(double)freq_; }
247 unsigned long count_;
248 unsigned long start_;
251void TimerImplStd::stop(
void)
253 unsigned long stop_ = clock();
254 count_ += stop_-start_;
264#if defined(WIN32) && (defined(_MSC_VER) || defined(__INTEL_COMPILER) || defined(__MINGW32__))
265 impl_ =
new TimerImplWin32;
266#elif defined(__GNUC__) && defined(__POSIX__)
271# if defined(CLOCK_REALTIME_HR)
272 impl_ =
new TimerImplPosix<CLOCK_REALTIME_HR>;
274 impl_ =
new TimerImplPosix<CLOCK_REALTIME>;
276#elif (defined(__GNUC__) && !defined(__FreeBSD__) || (defined(__INTEL_COMPILER) && !defined(WIN32)) ) && !defined(__MINGW32__)
277 impl_ =
new TimerImplGToD;
279 impl_ =
new TimerImplStd;
290void Timer::reset(
void)
296void Timer::start(
void)
302void Timer::stop(
void)
308void Timer::cont(
void)
314double Timer::seconds(
void)
const
316 return state_==Stopped ? impl_->seconds() : 0.0;
319std::string Timer::as_string(Timer::Format format)
321 if (state_ == Running)
323 return as_string(impl_->seconds(),format);
326std::string Timer::as_string(
double seconds, Timer::Format format)
335 bool negative =
false;
343 fraction = modf(seconds,&integer);
345 t = (
unsigned long)integer;
347 hour = short( t / 3600L );
349 min = short( t / 60L );
360 case Timer::Automatic:
362 ptr += sprintf(ptr,
"%02dh:",hour);
365 ptr += sprintf(ptr,
"%02dm:",min);
366 else if (ptr>
string && hour)
367 ptr += sprintf(ptr,
"00m:");
370 ptr += sprintf(ptr,
"%02d",sec);
371 else if (ptr>
string && min)
372 ptr += sprintf(ptr,
"00");
376 if (ptr >
string && sec)
378 sprintf(ptr,
".%.3fs",fraction);
387 else if ( fraction * 1e2 > 0.1)
388 sprintf(ptr,
"%.3fcs",fraction*1.e2);
389 else if ( fraction * 1e3 > 0.1)
390 sprintf(ptr,
"%.3fms",fraction*1.e3);
391 else if ( fraction * 1e6 > 0.1)
392 sprintf(ptr,
"%.1f\xb5s",fraction*1.e6);
393 else if ( fraction * 1e9 > 0.1)
394 sprintf(ptr,
"%.1fns",fraction*1.e9);
396 sprintf(ptr,
"%.1fps",fraction*1.e12);
404 ptr += sprintf(ptr,
"%02dh:%02dm:%02d",hour,min,sec);
405 sprintf(ptr,
".%.12fs",fraction);
415 sprintf(ptr,
"%02dh:%02dm:%02ds",hour,min,sec);
break;
417 ptr += sprintf(ptr,
"%02dm:%02d", min, sec);
418 sprintf(ptr,
".%.2fs",fraction);
427 case Timer::Seconds: sprintf(ptr,
"%.3fs",seconds);
break;
428 case Timer::HSeconds: sprintf(ptr,
"%.3fcs",seconds*1e2);
break;
429 case Timer::MSeconds: sprintf(ptr,
"%.3fms",seconds*1e3);
break;
430 case Timer::MicroSeconds: sprintf(ptr,
"%.1f\xb5s",seconds*1e6);
break;
431 case Timer::NanoSeconds: sprintf(ptr,
"%.1fns",seconds*1e9);
break;