有很多时候,实现一个功能后可能不仅仅要效果,还要效率,如果可以在极短的时间内完成一个功能那当然是最好不过的啦,但是可能经常会事与愿违。

这里就写一下,都可以怎样用C/C++或者Qt的方法来测试代码的运行时间。

一、C/C++方法

1.1 clock_t方法

clock_t方法需要包含头文件<time.h>,clock_t是一个长整型数字,它可以将时间精确到毫秒级别:

#include <time.h>

clock_t start, finish;
start = clock();
...
function();
...
finish = clock();
int duration = finish - start; double durationS = (double)duration / CLOCKS_PER_SEC;//如果需要换算成秒

1.2 使用windows API 1

头文件#include<Windows.h>,主要函数GetTickCount(),能达到毫秒级别:

#include <Windows.h> 

DWORD start_time = GetTickCount();
...
function();
...
DWORD end_time = GetTickCount();
DWORD duration = start_time - end_time;

1.3 使用Windows API 2

头文件依然是#include<Windows.h>,但是这次不一样,可以达到微秒级别:

#include <windows.h> 

double run_time;
_LARGE_INTEGER time_start; //开始时间
_LARGE_INTEGER time_over; //结束时间
double dqFreq; //计时器频率
LARGE_INTEGER f; //计时器频率 QueryPerformanceFrequency(&f);
dqFreq=(double)f.QuadPart;
QueryPerformanceCounter(&time_start); //计时开始 ...
function();
... QueryPerformanceCounter(&time_over); //计时结束 //乘以1000000把单位由秒化为微秒,精度为1000 000/(cpu主频)微秒
run_time=1000000*(time_over.QuadPart-time_start.QuadPart)/dqFreq;

也可以这么用的:

LARGE_INTEGER nFreq; LARGE_INTEGER t1;
LARGE_INTEGER t2; QueryPerformanceFrequency(&nFreq); QueryPerformanceCounter(&t1);
double dtStart = t1.QuadPart; ...
function();
... QueryPerformanceCounter(&t2); double dtEnd = t2.QuadPart; //后面的1000表示毫秒整数,微秒小数 double elapsed = (dtEnd - dtStart) / (double)nFreq.QuadPart * 1000;

二、Qt方法

Qt方法的话主要还是用到QTime类,Qt的方法基本上都只能精确到毫秒级别。

QTime startTime = QTime::currentTime();

...
function();
... QTime stopTime = QTime::currentTime();
int elapsed = startTime.msecsTo(stopTime);

要注意这个方法的是,如果你的代码块运行时间超级短,或者说是达到几个毫秒的级别的话,这个方法慎用,有毒,有时候直接就是0。

另一个也是Qt的QTime的方法,也是毫秒级别的,也是慎用:

QTime time;
time.start(); ...
function();
... int timeElapsed = time.elapsed();

三、结论

我个人的话,会相对比较推荐用clock_t的方法吧,这个好像是C/C++的东西,不算windows API的吧,一般来说冲突会相对比较少吧,如果对时间要求达到毫秒级别就满足的话,那如果是要达到微秒级别,那就没办法,暂时能找到的也就是1.3方法提到的window API 2的方法,但是这个因为直接用windows API,我竟然在某些场合下出现冲突的情况!!!

泪眼问花花不语,乱红飞过秋千去。

最新文章

  1. SQL Server开启READ_COMMITTED_SNAPSHOT
  2. DOM对象和JQuery对象
  3. win7如何设置某个软件不弹出用户账户控制
  4. Linux学习笔记16——wait函数
  5. 查询Sqlserver数据库死锁的一个存储过程(转)
  6. 配置分割Tomcat日志
  7. 内存/硬盘/io关系
  8. 浅谈web应用的负载均衡、集群、高可用(HA)解决方案(转)
  9. 用python实现模拟登录人人网
  10. RSA密码体制
  11. 首次使用AndroidStudio创建hello world遇到的坑!(Mac系统下)
  12. [python] 查询mysql返回datetime类型数据的处理
  13. 120分钟React快速扫盲教程
  14. 【Spring】14、SpringMVC拦截器的配置
  15. e与复利
  16. linux系统安全更新
  17. abp 使用 hangfire结合mysql
  18. VB.NET中lambda的写法
  19. spring boot 启动方式
  20. 虚拟信用卡 全球付, 工商银行国际E卡, Bancore, Entropay, Payoneer

热门文章

  1. 小程序填坑:2018最新getPhoneNumber功能详解
  2. cf 785#
  3. 044-PHP获得多个类对应的反射信息
  4. net GC 学习以及问题
  5. Web安全常见问题及解决方法
  6. 学术Essay写作如何体现逻辑的应用
  7. Python 异常处理(Try...Except)
  8. Linux每日一练20200221
  9. UVA - 12230 Crossing Rivers(过河)(期望)
  10. opencv 读写XML YML