38#ifndef VIGRA_TIMING_HXX
39#define VIGRA_TIMING_HXX
40#ifndef VIGRA_NO_TIMING
145 #include "vigra/windows.h"
149 inline double queryTimerUnit()
151 LARGE_INTEGER frequency;
152 QueryPerformanceFrequency(&frequency);
153 return 1000.0 / frequency.QuadPart;
156 static const double timerUnit = queryTimerUnit();
158 inline double tic_toc_diff_num(LARGE_INTEGER
const & tic)
161 QueryPerformanceCounter(&toc);
162 return ((toc.QuadPart - tic.QuadPart) * timerUnit);
165 inline std::string tic_toc_diff_string(LARGE_INTEGER
const & tic)
167 double diff = tic_toc_diff_num(tic);
169 s << diff <<
" msec";
173 inline void tic_toc_diff(LARGE_INTEGER
const & tic)
175 double diff = tic_toc_diff_num(tic);
176 std::cerr << diff <<
" msec" << std::endl;
179 inline double tic_toc_diff_num(std::vector<LARGE_INTEGER> & tic)
181 double res = tic_toc_diff_num(tic.back());
186 inline std::string tic_toc_diff_string(std::vector<LARGE_INTEGER> & tic)
188 std::string res = tic_toc_diff_string(tic.back());
193 inline void tic_toc_diff(std::vector<LARGE_INTEGER> & tic)
195 tic_toc_diff(tic.back());
201 #define USETICTOC LARGE_INTEGER tic_timer;
202 #define USE_NESTED_TICTOC std::vector<LARGE_INTEGER> tic_timer;
203 #define TIC QueryPerformanceCounter(&tic_timer);
204 #define TICPUSH tic_timer.push_back(LARGE_INTEGER());\
205 QueryPerformanceCounter(&(tic_timer.back()));
206 #define TOC tic_toc_diff (tic_timer);
207 #define TOCN tic_toc_diff_num (tic_timer)
208 #define TOCS tic_toc_diff_string(tic_timer)
212 #if defined(VIGRA_HIRES_TIMING) && !defined(__CYGWIN__)
219 inline double tic_toc_diff_num(timespec
const & tic)
222 clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &toc);
223 return ((toc.tv_sec*1000.0 + toc.tv_nsec/1000000.0) -
224 (tic.tv_sec*1000.0 + tic.tv_nsec/1000000.0));
227 inline std::string tic_toc_diff_string(timespec
const & tic)
229 double diff = tic_toc_diff_num(tic);
231 s << diff <<
" msec";
235 inline void tic_toc_diff(timespec
const & tic)
237 std::cerr << tic_toc_diff_string(tic) << std::endl;
240 inline double tic_toc_diff_num(std::vector<timespec> & tic)
242 double res = tic_toc_diff_num(tic.back());
247 inline std::string tic_toc_diff_string(std::vector<timespec> & tic)
249 std::string res = tic_toc_diff_string(tic.back());
254 inline void tic_toc_diff(std::vector<timespec> & tic)
256 tic_toc_diff(tic.back());
262 #define USETICTOC timespec tic_timer;
263 #define TIC clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &tic_timer);
264 #define TOC tic_toc_diff (tic_timer);
265 #define TOCN tic_toc_diff_num (tic_timer)
266 #define TOCS tic_toc_diff_string(tic_timer)
267 #define USE_NESTED_TICTOC std::vector<timespec> tic_timer;
268 #define TICPUSH tic_timer.push_back(timespec());\
269 clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &(tic_timer.back()));
273 #include <sys/time.h>
277 inline double tic_toc_diff_num(timeval
const & tic)
280 gettimeofday(&toc, NULL);
281 return ((toc.tv_sec*1000.0 + toc.tv_usec/1000.0) -
282 (tic.tv_sec*1000.0 + tic.tv_usec/1000.0));
285 inline std::string tic_toc_diff_string(timeval
const & tic)
287 double diff = tic_toc_diff_num(tic);
289 s << diff <<
" msec";
293 inline void tic_toc_diff(timeval
const & tic)
295 std::cerr << tic_toc_diff_string(tic)<< std::endl;
298 inline double tic_toc_diff_num(std::vector<timeval> & tic)
300 double res = tic_toc_diff_num(tic.back());
305 inline std::string tic_toc_diff_string(std::vector<timeval> & tic)
307 std::string res = tic_toc_diff_string(tic.back());
312 inline void tic_toc_diff(std::vector<timeval> & tic)
314 tic_toc_diff(tic.back());
320 #define USETICTOC timeval tic_timer;
321 #define TIC gettimeofday (&tic_timer, NULL);
322 #define TOC tic_toc_diff (tic_timer);
323 #define TOCN tic_toc_diff_num (tic_timer)
324 #define TOCS tic_toc_diff_string(tic_timer)
325 #define USE_NESTED_TICTOC std::vector<timeval> tic_timer;
326 #define TICPUSH tic_timer.push_back(timeval());\
327 gettimeofday(&(tic_timer.back()), NULL);
337#define TICTOCLOOP_BEGIN(inner_repetitions,outer_repetitions) \
340 double tictoc_best_, tictoc_inner_repetitions_=inner_repetitions; size_t tictoc_outer_repetitions_=outer_repetitions; \
341 for (size_t tictoccounter_=0; tictoccounter_<tictoc_outer_repetitions_; ++tictoccounter_) { \
343 for (size_t tictocinnercounter_=0; tictocinnercounter_<inner_repetitions; ++tictocinnercounter_) { \
346#define TICTOCLOOP_END \
348 const double tictoc_cur_ = TOCN; \
349 if ((tictoccounter_==0) || (tictoc_cur_ < tictoc_best_)) \
350 tictoc_best_ = tictoc_cur_; \
352 std::cerr << tictoc_best_/tictoc_inner_repetitions_ \
353 << " msec (best-of-" << tictoc_outer_repetitions_ << ")" << std::endl; \
365#define USE_NESTED_TICTOC
367#define TICTOCLOOP_BEGIN(inner_repetitions,outer_repetitions) do {
368#define TICTOCLOOP_END } while(false);