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,将计时功能加入到宏中,即可每次运行某一个函数,自动打印计时。
相关文章推荐
- Centos系统下Lamp环境的快速搭建(超详细)
- Linux内核驱动 GPIO子系统 GPIO的使用
- Solr与tomcat整合,并添加中文分词器
- linux mysql大小写敏感问题
- linux下iptables命令
- bash bad interpreter: 没有那个文件或目录
- LINUX 部署 WEB.PY 验证码服务的 配置说明书
- BeanUtils.copyProperties() 用法
- 安装Hadoop,启动hadoop(每次都用),设置免密码登陆
- TOP 10开源的推荐系统简介
- PHP 7.0 For Linux的安装使用与性能监测
- ecshop去版权禁止提交信息到官网完全版
- linux 批量删除目录下的文件夹,包含子文件
- Hadoop零基础高端实战培训视频教程|2016最新Hadoop教程
- openfire修改管理控制台admin用户密码
- NSRunLoop详解
- windows 向linux服务器上传文件命令
- How to Record your Voice from the Microphone on Ubuntu/Linux Mint
- linux中vi/vim显示行号设置
- centos彻底删除文件夹、文件命令