00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00034
00035
00036 #ifndef OPENIMAGEIO_TIMER_H
00037 #define OPENIMAGEIO_TIMER_H
00038
00039 #ifdef _WIN32
00040 # include "osdep.h"
00041 #else
00042 #include <sys/time.h>
00043 #endif
00044
00045
00046 #ifdef OPENIMAGEIO_NAMESPACE
00047 namespace OPENIMAGEIO_NAMESPACE {
00048 #endif
00049
00050
00070 class Timer {
00071 public:
00072 #ifdef _WIN32
00073 typedef LARGE_INTEGER value_t;
00074
00075 #else
00076 typedef struct timeval value_t;
00077 #endif
00078
00081 Timer (bool startnow=true) : m_ticking(false), m_elapsed(0)
00082 {
00083 if (startnow)
00084 start();
00085 }
00086
00089 ~Timer () { }
00090
00093 void start () {
00094 if (! m_ticking) {
00095 m_starttime = now();
00096 m_ticking = true;
00097 }
00098 }
00099
00102 void stop () {
00103 if (m_ticking) {
00104 value_t n = now();
00105 m_elapsed += diff (n, m_starttime);
00106 m_ticking = false;
00107 }
00108 }
00109
00112 void reset (void) {
00113 m_elapsed = 0;
00114 m_ticking = false;
00115 }
00116
00119 double operator() (void) const {
00120 return m_elapsed + time_since_start();
00121 }
00122
00125 double time_since_start (void) const {
00126 if (m_ticking) {
00127 value_t n = now();
00128 return diff (m_starttime, n);
00129 } else {
00130 return 0;
00131 }
00132 }
00133
00134 private:
00135 bool m_ticking;
00136 value_t m_starttime;
00137 double m_elapsed;
00138
00141 value_t now (void) const {
00142 value_t n;
00143 #ifdef _WIN32
00144 QueryPerformanceCounter (&n);
00145 #else
00146 gettimeofday (&n, NULL);
00147 #endif
00148 return n;
00149 }
00150
00153 static double diff (const value_t &then, const value_t &now) {
00154 #ifdef _WIN32
00155
00156 value_t freq;
00157 QueryPerformanceFrequency (&freq);
00158 return (double)(now.QuadPart - then.QuadPart) / (double)freq.QuadPart;
00159 #else
00160 return fabs ((now.tv_sec - then.tv_sec) +
00161 (now.tv_usec - then.tv_usec) / 1e6);
00162 #endif
00163 }
00164 };
00165
00166
00167
00170 template <class TIMER=Timer>
00171 class ScopedTimer {
00172 public:
00175 ScopedTimer (TIMER &t) : m_timer(t) { start(); }
00176
00179 ~ScopedTimer () { stop(); }
00180
00183 void start () { m_timer.start(); }
00184
00187 void stop () { m_timer.stop(); }
00188
00191 void reset () { m_timer.reset(); }
00192
00193 private:
00194 TIMER &m_timer;
00195 };
00196
00197
00198 #ifdef OPENIMAGEIO_NAMESPACE
00199 };
00200 using namespace OPENIMAGEIO_NAMESPACE;
00201 #endif
00202
00203 #endif // OPENIMAGEIO_TIMER_H