首页 > 代码库 > opencv中测量运行时间的函数

opencv中测量运行时间的函数

最开始的C接口中的是 cvGetTickCount()和 cvGetTickFrequency(),在程序段的开始和结束时两次使用cvGetTickCount(),然后将两次的差除以cvGetTickFrequency()后就可以获得程序段的以微秒us为单位的运行时间,不是很精确但是一般足够了。

         到了2.x之后在命名空间cv中又多了几个函数,getTickCount(),getTickFrequency(),getCPUTickCount(),此时仍然可以使用上面的C接口的函数,也可以使用这几个namespace cv中的函数,两次使用getTickCount(),然后再除以getTickFrequency(),不过需要注意的是这时计算出来的是以秒s为单位的时间,这个是与上面的带cv前缀的函数的不同,而要使用更精确的计时,就需要使用getCPUTickCount(),不过现代计算机CPU的频率会随着负载而变化所以没大有必要使用该函数,可以参看函数的介绍【Also, since a modern CPU varies the CPU frequency depending on the load, the number of CPU clocks spent in some code cannot be directly converted to time units. Therefore,getTickCount is generally a preferable solution for measuring execution time.】也就是使用getTickCount就足够了。

        同时C++接口中还将上面的函数封装为了一个类TickMeter,方便使用,下面是关于TickMeter的声明和实现的源码:

[cpp] view plaincopyprint?
 
  1. //contrib.hpp    
  2. class CV_EXPORTS TickMeter  
  3. {  
  4. public:  
  5.     TickMeter();  
  6.     void start();  
  7.     void stop();  
  8.   
  9.     int64 getTimeTicks() const;  
  10.     double getTimeMicro() const;  
  11.     double getTimeMilli() const;  
  12.     double getTimeSec()   const;  
  13.     int64 getCounter() const;  
  14.   
  15.     void reset();  
  16. private:  
  17.     int64 counter;  
  18.     int64 sumTime;  
  19.     int64 startTime;  
  20. };  
  21. CV_EXPORTS std::ostream& operator<<(std::ostream& out, const TickMeter& tm);  
  22.   
  23. //Spinimages.cpp      
  24. cv::TickMeter::TickMeter() { reset(); }  
  25. int64 cv::TickMeter::getTimeTicks() const { return sumTime; }  
  26. double cv::TickMeter::getTimeMicro() const { return (double)getTimeTicks()/cvGetTickFrequency(); }  
  27. double cv::TickMeter::getTimeMilli() const { return getTimeMicro()*1e-3; }  
  28. double cv::TickMeter::getTimeSec()   const { return getTimeMilli()*1e-3; }      
  29. int64 cv::TickMeter::getCounter() const { return counter; }  
  30. void  cv::TickMeter::reset() {startTime = 0; sumTime = 0; counter = 0; }  
  31.   
  32. void cv::TickMeter::start(){ startTime = cvGetTickCount(); }  
  33. void cv::TickMeter::stop()  
  34. {  
  35.     int64 time = cvGetTickCount();  
  36.     if ( startTime == 0 )  
  37.         return;  
  38.   
  39.     ++counter;  
  40.   
  41.     sumTime += ( time - startTime );  
  42.     startTime = 0;  
  43. }  
  44.   
  45. std::ostream& cv::operator<<(std::ostream& out, const TickMeter& tm){ return out << tm.getTimeSec() << "sec"; }  

      可以看出TickMeter仅仅是将C接口的函数进行了一下封装,不过使用时就方便多了,不用去反复gettickcount然后除以frequency了,只需要在开始时调用start();结束时调用stop(),然后如果需要以us为单位的运行时间就调用getTimeMicro(),以ms为单位的就调用getTimeMilli(),以s为单位的是getTimeSec(),而getTimeTicks()返回运行时间的tickcount,getTimeTicks()返回的是调用stop的次数,同时该类还重载了ostream,可以方便的以s为单位直接输出。

一个小例子:

[cpp] view plaincopyprint?
 
  1. TickMeter tm;     
  2. tm.start();  
  3.     int col=temp.cols, row = temp.rows;  
  4.     if (temp.isContinuous())  
  5.     {  
  6.         col*=row;  
  7.         row =1;  
  8.     }  
  9.     for (i=0; i<row; ++i)  
  10.     {  
  11.         const float *pt = temp.ptr<float>(i);  
  12.         for (j=0; j<col;++j)  
  13.         {  
  14.             float mm=pt[3*j];  
  15.             mm = mm/(float)20.6;  
  16.         }  
  17.     }  
  18.     tm.stop();  
  19.     cout<<"count="<<tm.getCounter()<<",process time="<<tm.getTimeMilli()<<endl;  


【NOTE!TickMeter对象的计时是累积的,如果要分段计时的话,获取运行时间之后,下一次调用start()之前需要调用reset()将计时归零,否则获得的时间是累积运行时间】 

opencv中测量运行时间的函数