36 #ifndef OPENIMAGEIO_TIMER_H
37 #define OPENIMAGEIO_TIMER_H
43 #elif defined(__APPLE__)
44 # include <mach/mach_time.h>
83 typedef LARGE_INTEGER value_t;
85 #elif defined(__APPLE__)
86 typedef unsigned long long value_t;
88 typedef struct timeval value_t;
93 Timer (
bool startnow=
true) : m_ticking(false), m_elapsed(0)
100 m_starttime.QuadPart = 0;
101 #elif defined(__APPLE__)
104 m_starttime.tv_sec = 0;
105 m_starttime.tv_usec = 0;
129 m_elapsed += diff (m_starttime, n);
147 double r = m_ticking ? diff (m_starttime, n) : 0.0;
156 double operator() (
void)
const {
157 return m_elapsed + time_since_start();
162 double time_since_start (
void)
const {
165 return diff (m_starttime, n);
178 value_t now (
void)
const {
181 QueryPerformanceCounter (&n);
182 #elif defined(__APPLE__)
183 n = mach_absolute_time();
185 gettimeofday (&n, NULL);
192 static double diff (
const value_t &then,
const value_t &now) {
196 QueryPerformanceFrequency (&freq);
197 return (
double)(now.QuadPart - then.QuadPart) / (
double)freq.QuadPart;
198 #elif defined(__APPLE__)
205 mach_timebase_info_data_t time_info;
206 mach_timebase_info(&time_info);
207 double seconds_per_tick = (1e-9*
static_cast<double>(time_info.numer))/
208 static_cast<double>(time_info.denom);
209 value_t d = (now>then) ? now-then : then-now;
210 return d * seconds_per_tick;
212 return fabs (static_cast<double>(now.tv_sec - then.tv_sec) +
213 static_cast<double>(now.tv_usec - then.tv_usec) / 1e6);
222 template <
class TIMER=Timer>
239 void stop () { m_timer.stop(); }
259 double mintime = 1.0e30, maxtime = 0.0;
270 *range = maxtime-mintime;
279 #endif // OPENIMAGEIO_TIMER_H