C++ 计算代码运行时间的几种方法  

2010-08-03 08:18:08|  分类: C/C++|字号 订阅

 
 
 
有许多专门的测试工具,测试的准确性很高,本文说的是一些简单的测试方法,这些方法多数是记录CPU的运行时间,没有考虑操作系统的分时复用,不过不太严格的情况都可一用。

1. #include <time.h>
long start=clock(),end(0);
//ToDo:process code
end=clock();
long result=(end-start)/1000

2. windows 平台
#include <windows.h>
double start=getticktime(),end(0);
//ToDo:process code
end=getticktime();
double result=end-start;

3.windows 平台
#include <windows.h>
    LARGE_INTEGER frequency,start,end;   
    QueryPerformanceFrequency(&frequency);   
    QueryPerformanceCounter(&start);   
//ToDO:process code 
    QueryPerformanceCounter(&end);   
    double   d   =   (double)(end.QuadPart   -   start.QuadPart)   /   (double)frequency.QuadPart   *   1000.0; 

4.根据线程而来的
CThreadTime   ElapsedTime;   
ElapsedTime.BeginGetElapsedTime();   
    
//TODO:   Your   performance   code   
    
int   nThreadTine   =   ElapsedTime.EndGetElapsedTime();   
    
    
该类的实现如下:   
//   This   class   is   for   getting   the   elapsed   thread   time   of   the   CPU,   the   unit   is   ms   
//   the   usage   is:     
//     
//   CThreadTime   ElapsedTime;   
//   ElapsedTime.BeginGetElapsedTime();   
//   TODO:   Your   performance   code   
//   int   nThreadTine   =   ElapsedTime.EndGetElapsedTime();   
//   
    
    
#include   <Windows.h>   
    
class   CThreadTime   
{   
public:           
          void         BeginGetElapsedTime();   
          __int64   EndGetElapsedTime();   
    
private:   
          __int64   FileTimeToQuadWord(PFILETIME   pft);   
    
private:   
          FILETIME   ftKernelTimeStart;   
          FILETIME   ftKernelTimeEnd;   
          FILETIME   ftUserTimeStart;   
          FILETIME   ftUserTimeEnd;   
          FILETIME   ftDummy;   
};   
    
//   Get   the   time   elapsed   since   the   thread   start   
inline   void   CThreadTime::BeginGetElapsedTime()   
{   
          GetThreadTimes(GetCurrentThread(),   &ftDummy,   &ftDummy,   &ftKernelTimeStart,   &ftUserTimeStart);   
}   
    
//   Calculate   the   time   elapsed     
inline   __int64   CThreadTime::EndGetElapsedTime()   
{   
          GetThreadTimes(GetCurrentThread(),   &ftDummy,   &ftDummy,   &ftKernelTimeEnd,   &ftUserTimeEnd);   
    
          __int64   qwKernelTimeElapsed   =   FileTimeToQuadWord(&ftKernelTimeEnd)   -   FileTimeToQuadWord(&ftKernelTimeStart);   
          __int64   qwUserTimeElapsed   =   FileTimeToQuadWord(&ftUserTimeEnd)   -   FileTimeToQuadWord(&ftUserTimeStart);   
    
          //   Get   total   time   duration   by   adding   the   kernel   and   user   times.   
          //   the   default   is   100ns,   so   we   convert   it   to   ms   
          return   (qwKernelTimeElapsed   +   qwUserTimeElapsed)   /   10000;   
}   
    
inline   __int64   CThreadTime::FileTimeToQuadWord(PFILETIME   pft)     
{   
          return   (Int64ShllMod32(pft->dwHighDateTime,   32)   |   pft->dwLowDateTime);   
}