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