C语言/C++测试算法运行时间的五个方法(关于时间的小知识)

怎么测试一段代码运行的时间?

一个好用的方法

可以使用如下代码

#include <time.h>//要包含这个头文件,因为使用到了clock函数获取时间
......
clock_t start = clock() ;
//表示当前CPU记录下的已经过了的毫秒数

/*算法的代码*/
/*算法的代码*/
/*算法的代码*/

clock_t end = clock() ;
printf("算法运行了%d ms",end - start) ;
//ms是时间单位,表示毫秒
......

原理

首先需要include<time.h>的头文件,因为我们使用了里面的东西。

(当然,直接用万能头也可以)

可以理解为是电脑内部有一个时钟,使用clock()函数就是通过这个函数获取了这个时钟一共转了多少圈,用算法运行前后的圈数相减再乘以一圈所花费的时间即可求出算法运行的时间(这个时钟转一圈需要1毫秒,1000毫秒等于一秒)

高级一点的方法

解析看代码qwq

原理同第一个方法

#include <windows.h>
......
DWORD Start = GetTickCount() ;

/*算法代码*/
/*算法代码*/
/*算法代码*/

DWORD End = GetTickCount() ;
//(End-Start)就是这一段代码运行时间, 同样也是以毫秒为单位,
//但是这个函数的精度只能精确到55ms,因为1个tick就是55ms。
//大概是这个时钟转的慢一点,
//而我们只能数出它大概转了几圈
//qwq(无辜的眼神)
.....

更高级的方法

还是看代码qwq(善良的眼神)

原理还是同第一个方法

#include  <windows.h>
......
DWORD Start = timeGetTime();

/*算法代码*/
/*算法代码*/
/*算法代码*/

DWORD End = timeGetTime();
//则(End-Start)就是你的程序运行时间, 以毫秒为单位
//虽然返回的值单位应该是ms,但精度只有10ms。(精度好低呀)
......

超级高级的方法

注意,这个方法不能直接用!!它要配置一个库文件才能用,超级麻烦!!!看看就好了。但是如果非得用这个方法的话可以去找一下Boost库,自己照着教程配置。原理自己看代码吧

#include<boost/timer.hpp>
......
timer t ;//相当于你自己买了一个小的计时器,
//告诉编译器你这个心爱的计时器名字叫做t
//以后自己说t就是要看时间!!!
//qwq

/*算法代码*/
/*算法代码*/
/*算法代码*/

cout<<"运行时间:"<<t.elapsed() <<"s"<<endl;
//你可以通过elapsed这个函数去获取这个小计时器
//所转过的圈数,单位?好像是秒,又好像是毫秒
//我怎么知道qwq......
......

超级无敌宇宙极其高级的方法

#include <windows.h>

......
double t = 0 ;  
LARGE_INTEGER nFreq ;  
LARGE_INTEGER nBeginTime ;
LARGE_INTEGER nEndTime ;  
QueryPerformanceFrequency(&nFreq) ;  
QueryPerformanceCounter(&nBeginTime) ;
 
/*算法代码*/
/*算法代码*/
/*算法代码*/

QueryPerformanceCounter(&nEndTime) ; 
t = (double)(nEndTime.QuadPart - nBeginTime.QuadPart) / (double)(nFreq.QuadPart) ;
//计算程序执行时间单位为秒数  
cout << "运行时间:" << t * 1000 << "ms" << endl ;
......

原理

这里使用高精度时控函数QueryPerformanceFrequency(),QueryPerformanceCounter()

它们是两个精度很高的函数,精度单位为微秒(1000微秒=一毫秒,1000毫秒=一秒)。使用QueryPerformanceCounter()即可获取这个高精度计时器的值,但是由于机器的原因,它们实际上的精度会大幅度受到机器运作的影响,则必须向系统查询它们确切的运作频率QueryPerformanceFrequency()函数提供了这个功能,可以通过这一个函数来获取高精度计时器的运作频率(在一秒钟之内它的运作次数),用两次调用QueryPerformanceCounter()函数的结果做差除以QueryPerformanceFrequency()的运作频率即可求出在两次“时间获取”之间所经过的时间。在其中放入想要测量时间的算法代码,就可以得知算法的运行时长。

通俗讲法

这是一个转得很快的时钟,并且一直有一个手疾眼快脑子聪明人一直在记录着它转过的总圈数。你先询问他现在的总圈数,然后去做你自己的事情,做完以后再次询问一遍当前的总圈数,两次结果做差,就是在你出去做事的这段时间内,这个人数了多少圈。在用这段时间他数的圈数除以他一秒钟数多少圈,就得出了你做这件事所花费的时间。

其中,QueryPerformanceFrequency()函数用于询问这个人时钟已经转了多少圈。

QueryPerformanceFrequency()用于获取时钟一分钟转多少圈

结束

谢谢!!

  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值