您的位置:首页 > 编程语言 > C语言/C++

C++程序耗时测试方法

2016-12-16 16:57 225 查看
一、QueryPerformanceCounter()

1、简介

 
   函数QueryPerformanceCounter()统计的是系统的滴答数,在要统计的程序执行前和执行后各调用一次该函数相减即可得到程序执行所耗的滴答数;转换后的时间计数可达到微妙级,但具体的实现与系统有关。因此需要先用QueryPerformanceFrequency()得到当前系统的频率值;QueryPerformanceFrequency()得到的也是系统每秒钟的滴答数,1除以滴答数即可得到频率值。

2、函数原型

  (1)
头文件:windows.h

            BOOL
QueryPerformanceCounter(LARGE_INTEGER *ipPerformanceCount);
//参数指向计数器的值

            BOOL
QueryPerformanceCounter (LARGE_INTEGER *lpCount);

           如果安装的硬件不支持高精度计时器,该参数将返回0;如果安装的硬件支持高精度计时器,函数将返回非0值。

(2) LARGE_INTEGER结构实际上是一个联合。如果你的编译器具有内置支持64位整数,使用QuadPart成员中存储的64位整数。否则,使用LowPart和HighPart成员的存储的64位整数。该类型的定义如下:

  typedef
union _ LARGE_INTEGER
  {

  
  struct

  
  {

  
    DWORD LowPart;

  
    LONG HighPart;

  
 };

 
      struct

  
{

  
   DWORD LowPart;

  
   LONG HighPart;

  
 }u;

  
  LONGLONG QuadPart;

  }
LARGE_INTEGER ,*PLARGE_INTEGER;  

3、使用示例

#include <iostream>
#include <windows.h>
#define NUM 100000
using namespace std;
int main()
{
int arry[NUM]={0};
double timeSpent=0;
LARGE_INTEGER nFreq;
LARGE_INTEGER nBeginTime;
LARGE_INTEGER nEndTime;
QueryPerformanceFrequency(&nFreq); //统计频率
QueryPerformanceCounter(&nBeginTime);//开始计时

for(int i=0;i<NUM;i++)
arry[i]=i;

QueryPerformanceCounter(&nEndTime); //结束计时
timeSpent=(double)(nEndTime.QuadPart-nBeginTime.QuadPart )/(nFreq.QuadPart );//得到的是耗时的秒数
timeSpent*=1000;//得到的是耗时的毫秒数
cout<<"数组循环赋值耗时:"<<timeSpent<<"ms"<<endl;
return 0;
}
结果:



二、GetTickCount()

1、简介

     GetTickCount()函数返回从操作系统启动到现在所经过(elapsed)的毫秒数,它的返回值是DWORD。在Release版本中,该函数从0开始计时,返回自设备启动后的毫秒数(不含系统暂停时间)。在Debug版本中,设备启动后便从计时器中减去180秒。这样方便测试使用该函数的代码的正确溢出处理。可以在要测试的程序开始处和结束处分别调用一次该函数,再相减,即可得到程序耗时。GetTickCount()精确度有限,跟CPU有关,一般是16ms,不会低于10ms。

2、函数原型

 
    
 头文件:windows.h 
 

        DWORD GetTickCount(void); 

3、使用示例

#include <iostream>
#include <windows.h>
#define NUM 100000
using namespace std;
int main()
{
int arry[NUM]={0};
DWORD timeSpent=0;
DWORD beginTime=GetTickCount();
for(int i=0;i<NUM;i++)
arry[i]=i;
DWORD endTime=GetTickCount();
timeSpent=endTime-beginTime;
cout<<"数组循环赋值耗时:"<<timeSpent<<"ms"<<endl;
return 0;
}
执行结果:(精确度不够)

  


  

  注意:以上方法得到的并非是精确的测试程序的真实执行时间,因为在函数和算法线程不可能一直占用CPU,不过已经可以定向的说明耗时情况。

 三、GetLocalTime()

1、简介

   GetLocalTime是一个Windows
API 函数,用来获取当地的当前系统日期和时间。与系统的时间设置有关。

2、函数原型

(1)

void GetLocalTime(  LPSYSTEMTIME lpSystemTime);
(2)
typedef struct _SYSTEMTIME {
WORD wYear;
WORD wMonth;
WORD wDayOfWeek;
WORD wDay;
WORD wHour;
WORD wMinute;
WORD wSecond;
WORD wMilliseconds;
} SYSTEMTIME;

3、使用示例

#include <iostream>
#include <windows.h>
using namespace std;
int main()
{
int timeSpent=0;
SYSTEMTIME beginTime,endTime;
GetLocalTime(&beginTime);
Sleep(10);
GetLocalTime(&endTime);
timeSpent=endTime.wMilliseconds -beginTime.wMilliseconds ;
cout<<"程序耗时:"<<timeSpent<<"ms"<<endl;
return 0;
}

结果:

   


分析:精度不够

  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: