c语言 计算函数执行时间

linux c语言 计算函数执行时间

虽然在linux下我们可以用time命令来计算一个执行程序的时间,可是time命令会把输入输出时间一并计算在内,对于计算函数执行时间并不精确,所以写出以下代码计算函数的执行时间:

#include<stdio.h>
#include<time.h>
#include<stdlib.h>

int main()
{
        struct timeval tpstart,tpend;
        float timeuse;
        int i;
        gettimeofday(&tpstart,NULL);

        scanf("%d", &i);
              /*这里计算的是scanf函数的执行时间,就是从函数执行到命令行输入回车的时间。*/

        gettimeofday(&tpend,NULL);
        timeuse=1000000*(tpend.tv_sec-tpstart.tv_sec)+
        tpend.tv_usec-tpstart.tv_usec;
        timeuse/=1000000;
        printf("Used Time:%f\n",timeuse);
        return(0);
}

通用方法1:
#include   <time.h>  
   
  time_t   start,   end;  
  time(&start);  
  ...  
  time(&end);  
   
  cout<<end-start;

方法2:
有许多专门的测试工具,测试的准确性很高,本文说的是一些简单的测试方法,这些方法多数是记录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);  
  }

在linux下计算程序执行时间:
$ time ./program

展开阅读全文

没有更多推荐了,返回首页