通常在跨平台编程的时候会遇到这个问题。sys/time.h是linux目录下的文件,里面有gettimeofday这种函数。这个问题,可以转化为,如果要在windows下实现任务计时间的功能,该如何做?根据精度要求可选择以下两种方式。
精度要求不高(毫秒级)
头文件:windows.h
函数声明:DWORD WINAPI GetTickCount(void)
其中DWORD的类型为无符号长整型,声明如下:
typedef unsigned long DWORD;
功能:返回自设备启动后的毫秒数
用法演示:
DWORD start,end; start = GetTickCount();//vs2019会建议采用GetTickCount64()函数 // compute task end = GetTickCount();//同上 printf("elapse time = %f\n",1.0*(end-start); ----------------------------- 输出: elapse time = 3016.000000ms
精度要求高(微秒级)
头文件:windows.h
函数声明:BOOL QueryPerformanceCounter(LARGE_INTEGER *lpPerformanceCount)
BOOL QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency)
其中LARGE_INTEGER 的类型声明如下:
typedef union_LARGE_INTEGER { struct { DWORD LowPart; LONG HightPart; }; LONG LONG QuadPart; }LARGE_INTEGER;
功能:第一个函数获得的是CPU从开机依赖执行的时钟周期数,第二个函数用于获取电脑的时钟周期。
用法演示:
LARGE_INTEGER nun; long long start,end,freq; QueryPerformanceFrequency(&num); freq = num.QuadPart; QueryPerformanceCounter(&num); start = num.QuadPart; // coumpute task QueryPerformanceCounter(&num); end = num.QuadPart; printf("elapse time = %f\n",(end-start)*1000.0/freq); ----------------------------- 输出: elapse time = 3009.578000ms
总结
附上完整演示版本:
#include <iostream> #include <windows.h> void AComputeTask() { Sleep(3000); int c = 1 + 2; } int main() { #if 0 DWORD start, end; start = GetTickCount64(); AComputeTask(); end = GetTickCount64(); printf("elapse time = %fms\n", 1.0*(end - start)); #else LARGE_INTEGER num; long long start, end, freq; QueryPerformanceFrequency(&num); freq = num.QuadPart; QueryPerformanceCounter(&num); start = num.QuadPart; AComputeTask(); QueryPerformanceCounter(&num); end = num.QuadPart; printf("elapse time = %fms\n", (end - start) * 1000.0 / freq); #endif return 0; }
对比两个版本,可以查看第二个版本可以精确到微秒。如果对精确度没有要求,可以任意选择一种计时方式,替代linux下的sys/time.h中的方法。
本文参考博文https://blog.csdn.net/fz_ywj/article/details/8109368,修改了部分代码,对原作者表示感谢。