44#ifndef DOXY_IGNORE_THIS
47#if defined(OM_CC_MIPS)
55#if defined(WIN32) && (defined(_MSC_VER) || defined(__INTEL_COMPILER) || defined (__MINGW32__) )
58#elif defined(__GNUC__) && defined(__POSIX__)
61#elif (defined(__GNUC__) && !defined(__FreeBSD__) || (defined(__INTEL_COMPILER) && !defined(WIN32))) && !defined(__MINGW32__)
64# include <sys/resource.h>
91 virtual ~TimerImpl() { ; }
93 virtual void reset(
void) = 0;
94 virtual void start(
void) = 0;
95 virtual void stop(
void) = 0;
96 virtual void cont(
void) = 0;
97 virtual double seconds(
void)
const = 0;
103#if defined(WIN32) && (defined(_MSC_VER) || defined(__INTEL_COMPILER) || defined (__MINGW32__) )
105class TimerImplWin32 :
public TimerImpl
109 LARGE_INTEGER count_;
110 LARGE_INTEGER start_;
113 TimerImplWin32(
void);
114 ~TimerImplWin32(
void) { ; }
116 virtual void reset(
void)
override;
117 virtual void start(
void)
override;
118 virtual void stop(
void)
override;
119 virtual void cont(
void)
override;
120 virtual double seconds(
void)
const override;
123TimerImplWin32::TimerImplWin32(
void)
125 if (QueryPerformanceFrequency(&freq_)==FALSE)
126 throw std::runtime_error(
"Performance counter of of stock!");
128 memset(&count_,0,
sizeof(count_));
129 memset(&start_,0,
sizeof(count_));
132void TimerImplWin32::reset(
void)
134 memset(&count_,0,
sizeof(count_));
135 memset(&start_,0,
sizeof(count_));
138void TimerImplWin32::start(
void)
141 QueryPerformanceCounter(&start_);
144void TimerImplWin32::stop(
void)
148 QueryPerformanceCounter(&stop_);
149 count_.QuadPart += stop_.QuadPart - start_.QuadPart;
152void TimerImplWin32::cont(
void)
154 QueryPerformanceCounter(&start_);
157double TimerImplWin32::seconds(
void)
const
159 return (
double)count_.QuadPart/(double)freq_.QuadPart;
163#elif defined(__GNUC__) && defined(__POSIX__)
165template <clock
id_t N>
166class TimerImplPosix :
public TimerImpl
169 TimerImplPosix() : id_(N), seconds_(0.0)
175 virtual void reset(
void)
override { seconds_ = 0.0; }
177 virtual void start(
void)
override { seconds_ = 0.0; clock_gettime( id_, &start_ ); }
178 virtual void stop(
void)
override
181 clock_gettime( id_, &stop );
182 seconds_ += ( stop.tv_sec - start_.tv_sec );
183 seconds_ += ( (double(stop.tv_nsec-start_.tv_nsec)*1e-9) );
186 virtual void cont(
void)
override { clock_gettime( id_, &start_ ); }
188 virtual double seconds()
override const {
return seconds_; }
197#elif (defined(__GNUC__) && !defined(__FreeBSD__) || (defined(__INTEL_COMPILER) && !defined(WIN32))) && !defined(__MINGW32__)
199class TimerImplGToD:
public TimerImpl
202 TimerImplGToD() : seconds_(0.0)
208 virtual void reset(
void)
override { seconds_ = 0.0; }
209 virtual void start(
void)
override { seconds_ = 0.0; gettimeofday( &start_, &tz_ ); }
211 virtual void stop(
void)
override
213 gettimeofday( &stop_, &tz_ );
215 seconds_ += (double)(stop_.tv_sec - start_.tv_sec);
216 seconds_ += (double)(stop_.tv_usec- start_.tv_usec)*1e-6;
219 virtual void cont(
void)
override { gettimeofday( &start_, &tz_); }
221 virtual double seconds()
const override {
return seconds_; }
225 struct timeval start_, stop_;
234static const unsigned long clockticks = CLOCKS_PER_SEC;
236class TimerImplStd :
public TimerImpl
239 TimerImplStd() : freq_(clockticks),count_(0),start_(0) { }
240 ~TimerImplStd() { ; }
242 virtual void reset(
void)
override { count_ = 0; }
243 virtual void start(
void)
override { count_ = 0; start_ = clock(); }
244 virtual void stop(
void)
override;
245 virtual void cont(
void)
override { start_ = clock(); }
246 virtual double seconds(
void)
const override {
return (
double)count_/(double)freq_; }
250 unsigned long count_;
251 unsigned long start_;
254void TimerImplStd::stop(
void)
256 unsigned long stop_ = clock();
257 count_ += stop_-start_;
267#if defined(WIN32) && (defined(_MSC_VER) || defined(__INTEL_COMPILER) || defined(__MINGW32__))
268 impl_ =
new TimerImplWin32;
269#elif defined(__GNUC__) && defined(__POSIX__)
274# if defined(CLOCK_REALTIME_HR)
275 impl_ =
new TimerImplPosix<CLOCK_REALTIME_HR>;
277 impl_ =
new TimerImplPosix<CLOCK_REALTIME>;
279#elif (defined(__GNUC__) && !defined(__FreeBSD__) || (defined(__INTEL_COMPILER) && !defined(WIN32)) ) && !defined(__MINGW32__)
280 impl_ =
new TimerImplGToD;
282 impl_ =
new TimerImplStd;
293void Timer::reset(
void)
299void Timer::start(
void)
305void Timer::stop(
void)
311void Timer::cont(
void)
317double Timer::seconds(
void)
const
319 return state_==Stopped ? impl_->seconds() : 0.0;
322std::string Timer::as_string(Timer::Format format)
324 if (state_ == Running)
326 return as_string(impl_->seconds(),format);
329std::string Timer::as_string(
double seconds, Timer::Format format)
338 bool negative =
false;
346 fraction = modf(seconds,&integer);
348 t = (
unsigned long)integer;
350 hour = short( t / 3600L );
352 min = short( t / 60L );
363 case Timer::Automatic:
365 ptr += sprintf(ptr,
"%02dh:",hour);
368 ptr += sprintf(ptr,
"%02dm:",min);
369 else if (ptr>
string && hour)
370 ptr += sprintf(ptr,
"00m:");
373 ptr += sprintf(ptr,
"%02d",sec);
374 else if (ptr>
string && min)
375 ptr += sprintf(ptr,
"00");
379 if (ptr >
string && sec)
381 sprintf(ptr,
".%.3fs",fraction);
390 else if ( fraction * 1e2 > 0.1)
391 sprintf(ptr,
"%.3fcs",fraction*1.e2);
392 else if ( fraction * 1e3 > 0.1)
393 sprintf(ptr,
"%.3fms",fraction*1.e3);
394 else if ( fraction * 1e6 > 0.1)
395 sprintf(ptr,
"%.1f\xb5s",fraction*1.e6);
396 else if ( fraction * 1e9 > 0.1)
397 sprintf(ptr,
"%.1fns",fraction*1.e9);
399 sprintf(ptr,
"%.1fps",fraction*1.e12);
407 ptr += sprintf(ptr,
"%02dh:%02dm:%02d",hour,min,sec);
408 sprintf(ptr,
".%.12fs",fraction);
418 sprintf(ptr,
"%02dh:%02dm:%02ds",hour,min,sec);
break;
420 ptr += sprintf(ptr,
"%02dm:%02d", min, sec);
421 sprintf(ptr,
".%.2fs",fraction);
430 case Timer::Seconds: sprintf(ptr,
"%.3fs",seconds);
break;
431 case Timer::HSeconds: sprintf(ptr,
"%.3fcs",seconds*1e2);
break;
432 case Timer::MSeconds: sprintf(ptr,
"%.3fms",seconds*1e3);
break;
433 case Timer::MicroSeconds: sprintf(ptr,
"%.1f\xb5s",seconds*1e6);
break;
434 case Timer::NanoSeconds: sprintf(ptr,
"%.1fns",seconds*1e9);
break;