在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);
上面的测量在工程中非常使用,基本可以在windows平台下测试一些使用时间的情况,比如用套接字发送一个大数据块、显示一个位图等等!对每个应用的程序段时间消耗都清楚,才能写出高质量的程序!