VC下毫秒级定时器、测量时间的获取、LARGE_INTEGER使用

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

你可能感兴趣的:(VC下毫秒级定时器、测量时间的获取、LARGE_INTEGER使用)