OpenCV图像处理中的性能测试(持续更新)

OpenCV图像处理中的性能测试

本文由 @lonelyrains出品,转载请注明出处。
文章链接: http://blog.csdn.net/lonelyrains/article/details/50456266

opencv中自带跨平台的计时代码实现。源码如下


int64 getTickCount(void)
{
#if defined WIN32 || defined _WIN32 || defined WINCE
    LARGE_INTEGER counter;
    QueryPerformanceCounter( &counter );
    return (int64)counter.QuadPart;
#elif defined __linux || defined __linux__
    struct timespec tp;
    clock_gettime(CLOCK_MONOTONIC, &tp);
    return (int64)tp.tv_sec*1000000000 + tp.tv_nsec;
#elif defined __MACH__ && defined __APPLE__
    return (int64)mach_absolute_time();
#else
    struct timeval tv;
    struct timezone tz;
    gettimeofday( &tv, &tz );
    return (int64)tv.tv_sec*1000000 + tv.tv_usec;
#endif
}

double getTickFrequency(void)
{
#if defined WIN32 || defined _WIN32 || defined WINCE
    LARGE_INTEGER freq;
    QueryPerformanceFrequency(&freq);
    return (double)freq.QuadPart;
#elif defined __linux || defined __linux__
    return 1e9;
#elif defined __MACH__ && defined __APPLE__
    static double freq = 0;
    if( freq == 0 )
    {
        mach_timebase_info_data_t sTimebaseInfo;
        mach_timebase_info(&sTimebaseInfo);
        freq = sTimebaseInfo.denom*1e9/sTimebaseInfo.numer;
    }
    return freq;
#else
    return 1e6;
#endif
}

其中getTickCount用来计算cpu运算周期数,getTickFrequency用来计算cpu运算频率。总耗时即周期数/频率,单位是秒。

最直观的计时设计:

每次要测一个函数运行性能消耗时,就在运算之前定义一个getTickCount、运算之后定义一个getTickCount,差值/频率,得到消耗时长。

这样做的缺点是,需要每次都重写很多代码。

简单的计时设计:

为了解决每次都重写很多代码的麻烦,可以定义一个全局变量g_tick,然后定义一个宏。每次要更新并打印时,只用调用一次这个宏。
该宏定义可以为:

//一行代码,所以没有续行符‘\’
#define SHOW_TICK() do{printf("%d(ms),func:%s,line:%d\n",int(1000*(cv::getTickCount()-g_tick)/cv::getTickFrequency()),__FUNCTION__,__LINE__); updateTick();}while(0)

这样一来,每次都可以与上一次调用SHOW_TICK()进行比较,得到差值并打印出来。

这样做的缺点是,不是线程安全的。如果从给g_tick加锁的角度考虑问题,则会增加不必要的性能损耗。虽然这点在测试性能的打印中表现不出来,但是会在实际运行中表现出来。

定义一个计时类

检测代码段耗时时,在头和尾每次都分别new一个计时类对象,delete一个对象。构造函数和析构函数中去做计时。

缺点:调用需要写两行代码。

使用之前的调试工具框架

参见专栏给函数增加Debug头
重定义Debug_Func,将计时功能加入到宏中,即可每次运行某一个函数,自动打印计时。

你可能感兴趣的:(性能测试,opencv,跨平台,图像处理)