C/C++精确计算程序运行时间(Windows)

1、头文件time.h,计时函数clock()
    clock_t clock(void);    //clock_t 是long类型
    该函数返回从开启这个进程到该时刻所用的时间,每秒分成CLOCKS_PER_SEC个单元。如果经过的时间过长超出最大表示范围,则返回-1。

clock_t start = clock();    // the code need to measure time    
clock_t end = clock();    
double timeSpend = (double)(end – start) / CLOCKS_PER_SEC; //得到的结果是秒,(end-start)得到的结果是毫秒

2、头文件(函数在sysinfoapi.h中,使用时#include Windows.h即可),GetTickCount()
DWORD GetTickCount();
    返回自系统启动以来经过的毫秒数,最多49.7天。

DWORD start = GetTickCount();    // the code need to measure time    
DWORD end = GetTickCount();    
DWORD timeSpend = end – start;    //得到的结果是毫秒


3、头文件(函数在sysinfoapi.h中,使用时#include Windows.h即可),GetTickCount64()

ULONGLONG GetTickCount64();    返回自系统启动以来经过的毫秒数。    
ULONGLONG start = GetTickCount64();    // the code need to measure time    
ULONGLONG end = GetTickCount64();    
ULONGLONG timeSpend = end – start;    //得到结果是毫秒

4、头文件(函数在profileapi.h中,使用时#include Windows.h即可),QueryPerformanceCounter()
    检索性能计数器的当前值,这是一个高分辨率(<1us)时间戳,可用于时间间隔测量。
    BOOL QueryPerformanceCounter(LARGE_INTEGER *lpPerformanceCount);
    参数:指向接收当前性能计数器值(以计数为单位)的变量的指针。
    返回值:失败返回0,成功返回非0

LARGE_INTEGER StartingTime, EndingTime, ElapsedMicroseconds;
LARGE_INTEGER Frequency;

QueryPerformanceFrequency(&Frequency);  //
QueryPerformanceCounter(&StartingTime);
	
// Activity to be timed

QueryPerformanceCounter(&EndingTime);
ElapsedMicroseconds.QuadPart = EndingTime.QuadPart - StartingTime.QuadPart;

double timeSpend= (ElapsedMicroseconds.QuadPart * 1000.0) / Frequency.QuadPart;
//得到的结果是毫秒。如果需要得到秒,则将1000换成1000000

  

检索性能计数器的频率。 性能计数器的频率在系统启动时是固定的,并且在所有处理器之间均保持一致。 因此,只需要在应用程序初始化时查询频率,就可以缓存结果。可以理解为计数器的频率,即每秒运行多少次。

参数:指向接收当前性能计数器频率的变量的指针,以每秒计数为单位。 如果安装的硬件不支持高分辨率性能计数器,则此参数可以为零(在运行Windows XP或更高版本的系统上不会出现)。

返回值:如果安装的硬件支持高分辨率性能计数器,则返回值为非零。如果函数失败,则返回值为零。 在运行Windows XP或更高版本的系统上,该函数将始终成功执行,因此永远不会返回零。

总结,如果需要精确测量或者统计调用时间(如调用多次,每次时间可能小于1ms的场合),建议用QueryPerformanceCounter()函数。

最后,附上QueryPerformanceCounter()的链接:https://docs.microsoft.com/zh-cn/windows/win32/api/profileapi/nf-profileapi-queryperformancecounter
QueryPerformanceFrequency()的链接:https://docs.microsoft.com/en-us/windows/win32/api/profileapi/nf-profileapi-queryperformancefrequency?redirectedfrom=MSDN


 

你可能感兴趣的:(Windows,C,C++,精准运行时间,准确运行时间)