38 #ifndef VIGRA_TIMING_HXX
39 #define VIGRA_TIMING_HXX
40 #ifndef VIGRA_NO_TIMING
150 inline double queryTimerUnit()
152 LARGE_INTEGER frequency;
153 QueryPerformanceFrequency(&frequency);
154 return 1000.0 / frequency.QuadPart;
157 static const double timerUnit = queryTimerUnit();
159 inline double tic_toc_diff_num(LARGE_INTEGER
const & tic)
162 QueryPerformanceCounter(&toc);
163 return ((toc.QuadPart - tic.QuadPart) * timerUnit);
166 inline std::string tic_toc_diff_string(LARGE_INTEGER
const & tic)
168 double diff = tic_toc_diff_num(tic);
170 s << diff <<
" msec";
174 inline void tic_toc_diff(LARGE_INTEGER
const & tic)
176 double diff = tic_toc_diff_num(tic);
177 std::cerr << diff <<
" msec" << std::endl;
180 inline double tic_toc_diff_num(std::vector<LARGE_INTEGER> & tic)
182 double res = tic_toc_diff_num(tic.back());
187 inline std::string tic_toc_diff_string(std::vector<LARGE_INTEGER> & tic)
189 std::string res = tic_toc_diff_string(tic.back());
194 inline void tic_toc_diff(std::vector<LARGE_INTEGER> & tic)
196 tic_toc_diff(tic.back());
202 #define USETICTOC LARGE_INTEGER tic_timer;
203 #define USE_NESTED_TICTOC std::vector<LARGE_INTEGER> tic_timer;
204 #define TIC QueryPerformanceCounter(&tic_timer);
205 #define TICPUSH tic_timer.push_back(LARGE_INTEGER());\
206 QueryPerformanceCounter(&(tic_timer.back()));
207 #define TOC tic_toc_diff (tic_timer);
208 #define TOCN tic_toc_diff_num (tic_timer)
209 #define TOCS tic_toc_diff_string(tic_timer)
213 #if defined(VIGRA_HIRES_TIMING) && !defined(__CYGWIN__)
220 inline double tic_toc_diff_num(timespec
const & tic)
223 clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &toc);
224 return ((toc.tv_sec*1000.0 + toc.tv_nsec/1000000.0) -
225 (tic.tv_sec*1000.0 + tic.tv_nsec/1000000.0));
228 inline std::string tic_toc_diff_string(timespec
const & tic)
230 double diff = tic_toc_diff_num(tic);
232 s << diff <<
" msec";
236 inline void tic_toc_diff(timespec
const & tic)
238 std::cerr << tic_toc_diff_string(tic) << std::endl;
241 inline double tic_toc_diff_num(std::vector<timespec> & tic)
243 double res = tic_toc_diff_num(tic.back());
248 inline std::string tic_toc_diff_string(std::vector<timespec> & tic)
250 std::string res = tic_toc_diff_string(tic.back());
255 inline void tic_toc_diff(std::vector<timespec> & tic)
257 tic_toc_diff(tic.back());
263 #define USETICTOC timespec tic_timer;
264 #define TIC clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &tic_timer);
265 #define TOC tic_toc_diff (tic_timer);
266 #define TOCN tic_toc_diff_num (tic_timer)
267 #define TOCS tic_toc_diff_string(tic_timer)
268 #define USE_NESTED_TICTOC std::vector<timespec> tic_timer;
269 #define TICPUSH tic_timer.push_back(timespec());\
270 clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &(tic_timer.back()));
274 #include <sys/time.h>
278 inline double tic_toc_diff_num(timeval
const & tic)
281 gettimeofday(&toc, NULL);
282 return ((toc.tv_sec*1000.0 + toc.tv_usec/1000.0) -
283 (tic.tv_sec*1000.0 + tic.tv_usec/1000.0));
286 inline std::string tic_toc_diff_string(timeval
const & tic)
288 double diff = tic_toc_diff_num(tic);
290 s << diff <<
" msec";
294 inline void tic_toc_diff(timeval
const & tic)
296 std::cerr << tic_toc_diff_string(tic)<< std::endl;
299 inline double tic_toc_diff_num(std::vector<timeval> & tic)
301 double res = tic_toc_diff_num(tic.back());
306 inline std::string tic_toc_diff_string(std::vector<timeval> & tic)
308 std::string res = tic_toc_diff_string(tic.back());
313 inline void tic_toc_diff(std::vector<timeval> & tic)
315 tic_toc_diff(tic.back());
321 #define USETICTOC timeval tic_timer;
322 #define TIC gettimeofday (&tic_timer, NULL);
323 #define TOC tic_toc_diff (tic_timer);
324 #define TOCN tic_toc_diff_num (tic_timer)
325 #define TOCS tic_toc_diff_string(tic_timer)
326 #define USE_NESTED_TICTOC std::vector<timeval> tic_timer;
327 #define TICPUSH tic_timer.push_back(timeval());\
328 gettimeofday(&(tic_timer.back()), NULL);
330 #endif // VIGRA_HIRES_TIMING
338 #define TICTOCLOOP_BEGIN(inner_repetitions,outer_repetitions) \
341 double tictoc_best_, tictoc_inner_repetitions_=inner_repetitions; size_t tictoc_outer_repetitions_=outer_repetitions; \
342 for (size_t tictoccounter_=0; tictoccounter_<tictoc_outer_repetitions_; ++tictoccounter_) { \
344 for (size_t tictocinnercounter_=0; tictocinnercounter_<inner_repetitions; ++tictocinnercounter_) { \
347 #define TICTOCLOOP_END \
349 const double tictoc_cur_ = TOCN; \
350 if ((tictoccounter_==0) || (tictoc_cur_ < tictoc_best_)) \
351 tictoc_best_ = tictoc_cur_; \
353 std::cerr << tictoc_best_/tictoc_inner_repetitions_ \
354 << " msec (best-of-" << tictoc_outer_repetitions_ << ")" << std::endl; \
366 #define USE_NESTED_TICTOC
368 #define TICTOCLOOP_BEGIN(inner_repetitions,outer_repetitions) do {
369 #define TICTOCLOOP_END } while(false);
374 #endif // VIGRA_TIMING_HXX