C++ 记录程序运行时间的方法总结

来源:互联网 发布:js转圈的进度条效果 编辑:程序博客网 时间:2024/05/22 00:30

      在学习过程中很重要的一个必会的小技巧:计算某一段代码的执行时间,可以用来分析代码的效率和算法的时间复杂度等等(个人主要是在总结各种排序算法时遇到的这个方法),下面给出两种常用的方式:

第一种:使用GetTickCount函数

#include<iostream>#include<windows.h>int main(){DWORD start_time=GetTickCount();{//此处为被测试代码}DWORD end_time=GetTickCount();cout<<"The run time is:"<<(end_time-start_time)<<"ms!"<<endl;//输出运行时间return 0;}

 GetTickCount函数返回从系统运行到现在所经历的时间(类型为DWORD),单位为ms,因为DWORD表示范围的限制,所以使用此种方法存在限制,即系统的运行时间的ms表示不能超出DWORD的表示范围:也就是unsigned long,8个字节,4294967295。


第二种:使用clock()函数 

#include<iostream>#include<time.h>int main(){clock_t start_time=clock();{//被测试代码}clock_t end_time=clock();cout<< "Running time is: "<<static_cast<double>(end_time-start_time)/CLOCKS_PER_SEC*1000<<"ms"<<endl;//输出运行时间return 0;}


clock_t,clock()定义于time.h中,clock()返回从程序运行时刻开始的时钟周期数,类型为long.CLOCKS_PER_SEC定义了每秒钟包含多少了时钟单元数,因为计算ms,所以需要*1000。

由上面分析可知,用clock()函数计算运行时间,表示范围一定大于GetTickCount()函数,所以,建议使用clock()函数。


第二种:高精度计时函数 ,以微秒为单位(1毫秒=1000微秒)


先看二个函数的定义
BOOL QueryPerformanceCounter(LARGE_INTEGER *lpPerformanceCount);
得到高精度计时器的值(如果存在这样的计时器)。

BOOL QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency);
返回硬件支持的高精度计数器的频率(次每秒),返回0表示失败。

再看看LARGE_INTEGER
它其实是一个联合体,可以得到__int64 QuadPart,也可以分别得到低32位DWORD LowPart和高32位的值LONG HighPart。

在使用时,先使用QueryPerformanceFrequency()得到计数器的频率,再计算二次调用QueryPerformanceCounter()所得的计时器值之差,用差去除以频率就得到精确的计时了。


头文件:直接使用#include <windows.h>就可以了。

#include <stdio.h>  #include <windows.h>  int main()  {      //用QueryPerformanceCounter()来计时  微秒      LARGE_INTEGER  large_interger;      double dff;      __int64  c1, c2;      QueryPerformanceFrequency(&large_interger);      dff = large_interger.QuadPart;      QueryPerformanceCounter(&large_interger);      c1 = large_interger.QuadPart;      Sleep(800);      QueryPerformanceCounter(&large_interger);      c2 = large_interger.QuadPart;      printf("本机高精度计时器频率%lf\n", dff);      printf("第一次计时器值%I64d 第二次计时器值%I64d 计时器差%I64d\n", c1, c2, c2 - c1);      printf("计时%lf毫秒\n", (c2 - c1) * 1000 / dff);      return 0;  }  



0 0