您的位置:首页 > 运维架构

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

2016-01-04 15:50 483 查看

OpenCV图像处理中的性能测试

本文由 @lonelyrains出品,转载请注明出处。

文章链接: /article/3701695.html

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

[code]
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,然后定义一个宏。每次要更新并打印时,只用调用一次这个宏。

该宏定义可以为:

[code]//一行代码,所以没有续行符‘\’
#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,将计时功能加入到宏中,即可每次运行某一个函数,自动打印计时。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: