在VC中,使用自带的 SetTimer 函数的定时器精度不高,包括 GetTIckCount 获取滴答数(理论上说只有55ms的精度);还有 Sleep 函数,精度都不是很高,达不到毫秒级的测量;
可以使用多媒体下的定时器函数:
#include <windows.h> #include <stdio.h> #include <Mmsystem.h> //声明的头文件 //链接多媒体lib库 #pragma comment(lib, "Winmm.lib") void main() { timeBeginPeriod(1); //设置1毫秒的测量精度 Sleep(100); int j=0; //多次测量 for(int i=0; i<10; i++) { DWORD s = timeGetTime();//开始时间(毫秒级) //测量1:Sleep延时函数的精度 for (j=0; j<100; j++) Sleep(1); //测量2:for循环千万级延时 //for (j=0; j<10000000; j++);//测算34~40毫秒,所以for循环每条指令为3~4个ns DWORD e = timeGetTime();//结束时间(毫秒级) //显示测量时间 printf("%d\n", e-s);// } }
再来一个用QueryPerformanceFrequency类的函数测量延时的程序,这些函数在当前CPU上支持,比上面的多媒体更好用一些:
LARGE_INTEGER litmp; LONGLONG qt1,qt2; double dft,dff,dfm; //获得时钟频率 QueryPerformanceFrequency(&litmp);//获得时钟频率 dff=(double)litmp.QuadPart; //获得初始值 QueryPerformanceCounter(&litmp); qt1=litmp.QuadPart; //下面一些耗时的操作 Sleep(100); //获得终止值 QueryPerformanceCounter(&litmp); qt2=litmp.QuadPart; //获得对应的时间值,转到毫秒单位上 dfm=(double)(qt2-qt1); dft=dfm/dff; printf("用时: %.3f 毫秒\n", dft*1000.0);