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 inline double tic_toc_diff_num(LARGE_INTEGER
const & tic)
160 QueryPerformanceCounter(&toc);
161 static double unit = queryTimerUnit();
162 return ((toc.QuadPart - tic.QuadPart) * unit);
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 std::cerr << tic_toc_diff_string(tic) <<std::endl;
178 inline double tic_toc_diff_num(std::vector<LARGE_INTEGER> & tic)
180 double res = tic_toc_diff_num(tic.back());
185 inline std::string tic_toc_diff_string(std::vector<LARGE_INTEGER> & tic)
187 std::string res = tic_toc_diff_string(tic.back());
192 inline void tic_toc_diff(std::vector<LARGE_INTEGER> & tic)
194 tic_toc_diff(tic.back());
200 #define USETICTOC LARGE_INTEGER tic_timer;
201 #define USE_NESTED_TICTOC std::vector<LARGE_INTEGER> tic_timer;
202 #define TIC QueryPerformanceCounter(&tic_timer);
203 #define TICPUSH tic_timer.push_back(LARGE_INTEGER());\
204 QueryPerformanceCounter(&(tic_timer.back()));
205 #define TOC tic_toc_diff (tic_timer);
206 #define TOCN tic_toc_diff_num (tic_timer)
207 #define TOCS tic_toc_diff_string(tic_timer)
211 #if defined(VIGRA_HIRES_TIMING) && !defined(__CYGWIN__)
218 inline double tic_toc_diff_num(timespec
const & tic)
221 clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &toc);
222 return ((toc.tv_sec*1000.0 + toc.tv_nsec/1000000.0) -
223 (tic.tv_sec*1000.0 + tic.tv_nsec/1000000.0));
226 inline std::string tic_toc_diff_string(timespec
const & tic)
228 double diff = tic_toc_diff_num(tic);
230 s << diff <<
" msec";
234 inline void tic_toc_diff(timespec
const & tic)
236 std::cerr << tic_toc_diff_string(tic) << std::endl;
239 inline double tic_toc_diff_num(std::vector<timespec> & tic)
241 double res = tic_toc_diff_num(tic.back());
246 inline std::string tic_toc_diff_string(std::vector<timespec> & tic)
248 std::string res = tic_toc_diff_string(tic.back());
253 inline void tic_toc_diff(std::vector<timespec> & tic)
255 tic_toc_diff(tic.back());
261 #define USETICTOC timespec tic_timer;
262 #define TIC clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &tic_timer);
263 #define TOC tic_toc_diff (tic_timer);
264 #define TOCN tic_toc_diff_num (tic_timer)
265 #define TOCS tic_toc_diff_string(tic_timer)
266 #define USE_NESTED_TICTOC std::vector<timespec> tic_timer;
267 #define TICPUSH tic_timer.push_back(timespec());\
268 clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &(tic_timer.back()));
272 #include <sys/time.h>
276 inline double tic_toc_diff_num(timeval
const & tic)
279 gettimeofday(&toc, NULL);
280 return ((toc.tv_sec*1000.0 + toc.tv_usec/1000.0) -
281 (tic.tv_sec*1000.0 + tic.tv_usec/1000.0));
284 inline std::string tic_toc_diff_string(timeval
const & tic)
286 double diff = tic_toc_diff_num(tic);
288 s << diff <<
" msec";
292 inline void tic_toc_diff(timeval
const & tic)
294 std::cerr << tic_toc_diff_string(tic)<< std::endl;
297 inline double tic_toc_diff_num(std::vector<timeval> & tic)
299 double res = tic_toc_diff_num(tic.back());
304 inline std::string tic_toc_diff_string(std::vector<timeval> & tic)
306 std::string res = tic_toc_diff_string(tic.back());
311 inline void tic_toc_diff(std::vector<timeval> & tic)
313 tic_toc_diff(tic.back());
319 #define USETICTOC timeval tic_timer;
320 #define TIC gettimeofday (&tic_timer, NULL);
321 #define TOC tic_toc_diff (tic_timer);
322 #define TOCN tic_toc_diff_num (tic_timer)
323 #define TOCS tic_toc_diff_string(tic_timer)
324 #define USE_NESTED_TICTOC std::vector<timeval> tic_timer;
325 #define TICPUSH tic_timer.push_back(timeval());\
326 gettimeofday(&(tic_timer.back()), NULL);
328 #endif // VIGRA_HIRES_TIMING
334 #define TICTOCLOOP_BEGIN(inner_repetitions,outer_repetitions) \
337 double tictoc_best_, tictoc_inner_repetitions_=inner_repetitions; size_t tictoc_outer_repetitions_=outer_repetitions; \
338 for (size_t tictoccounter_=0; tictoccounter_<tictoc_outer_repetitions_; ++tictoccounter_) { \
340 for (size_t tictocinnercounter_=0; tictocinnercounter_<inner_repetitions; ++tictocinnercounter_) { \
343 #define TICTOCLOOP_END \
345 const double tictoc_cur_ = TOCN; \
346 if ((tictoccounter_==0) || (tictoc_cur_ < tictoc_best_)) \
347 tictoc_best_ = tictoc_cur_; \
349 std::cerr << tictoc_best_/tictoc_inner_repetitions_ \
350 << " msec (best-of-" << tictoc_outer_repetitions_ << ")" << std::endl; \
362 #define USE_NESTED_TICTOC
364 #define TICTOCLOOP_BEGIN {
365 #define TICTOCLOOP_END }
370 #endif // VIGRA_TIMING_HXX