枫之阁 发表于 2022-8-15 22:11:17

C++获取程序执行时间的五个方法对比


五种获取C/C++程序执行时间的方法对比如下:

核心函数                                 头文件      函数库      精度   准确度
QueryPerformanceCounter      windows.h      API         us       非常准确
GetTickTount                        windows.h       API          ms       准确
clock                                       time.h          C函数      ms      较准确
time                                          time.h          C函数       s         很准确
ftime                                    sys/timeb.h   C函数       ms       较准确

在windows平台下建议使用GetTickCount,当对精度和准确度要求高可以用QueryPerformanceCounter,Linux平台下建议使用ftime,
本程序均在windows平台下运行,五种获取程序执行时间的代码如下:

#include <iostream>
#include <fstream>
#include <ctime>
#include <windows.h>
#include <tchar.h>
#include <sys/timeb.h>
#include <time.h>
#include <cmath>
#include <stdio.h>

using namespace std;

/**************************获取系统时间*************************/
void MyGetSystemTime()
{
    SYSTEMTIME currentTime;
    GetSystemTime(¤tTime);
    printf("time: %u/%u/%u %u:%u:%u:%u %d\n",   
      currentTime.wYear,currentTime.wMonth,currentTime.wDay,   
      currentTime.wHour,currentTime.wMinute,currentTime.wSecond,   
      currentTime.wMilliseconds,currentTime.wDayOfWeek);
}


/****************自己实现的定时器,要比Sleep准确****************/
void MySleep(DWORD dwMilliseconds)
{
    LARGE_INTEGER litmp;
    LONGLONG QPart1;
    QueryPerformanceCounter(&litmp);
    QPart1 = litmp.QuadPart;//获得初始值

    LONGLONG QPart2;
    double dfMinus, dfFreq, dfTim;
    QueryPerformanceFrequency(&litmp);
    dfFreq = (double)litmp.QuadPart;//获得计数器的时钟频率

    do
    {
      QueryPerformanceCounter(&litmp);
      QPart2 = litmp.QuadPart;//获得中止值
      dfMinus = (double)(QPart2-QPart1);
      dfTim = dfMinus / dfFreq * 1000;//获得对应的时间值,单位为毫秒
    }while(dfTim < dwMilliseconds);
}

int main()
{

/**************QueryPerformanceCounter(),windows.h,API,us****************///精度最高
   LARGE_INTEGER nFreq;
   LARGE_INTEGER nBeginTime;
   LARGE_INTEGER nEndTime;

   double time;
   QueryPerformanceFrequency(&nFreq);
   QueryPerformanceCounter(&nBeginTime);   
   Sleep(1000);
   QueryPerformanceCounter(&nEndTime);

   time=(double)(nEndTime.QuadPart-nBeginTime.QuadPart)/(double)nFreq.QuadPart;
   printf("%f\n",time);


/**************GetTickCount(),windows.h,API,ms****************///首选
    DWORD start, end;
    start = GetTickCount();
    MySleep(1000);
    end = GetTickCount();
    printf("time: %d ms\n", end - start);


/**************clock(),time.h,C函数,ms,不太准****************/
    clock_t start, end;
    start = clock();
    Sleep(1000);
    end = clock();
    printf("time: %d ms\n", end - start);


/**************time(),time.h,C函数,s****************/
    time_t start, end;
    start = time(NULL);
    Sleep(1000);
    end = time(NULL);
    printf("time: %d ms\n", end - start);


/**************ftime(),sys/timeb.h,C函数,ms,不太准****************/
    struct timeb startTime , endTime;
    ftime(&startTime);
    Sleep(1000);
    ftime(&endTime);
    printf("time: %d ms\n", (endTime.time-startTime.time)*1000 + (endTime.millitm - startTime.millitm));
    return 0;
}
页: [1]
查看完整版本: C++获取程序执行时间的五个方法对比