Win32函数Sleep的精度测试

用了三种方法,第一种使用高精度性能计数器;第二种是使用多媒体定时器,另一种是《Windows图形编程》里提供的CPU周期来获取。推荐第一种方式测量:

先看第一种:

#include <windows.h>
#include <stdio.h>

void main()
{
	LARGE_INTEGER litmp;
	LONGLONG qt1,qt2;
	double dft,dff,dfm;

	//获得时钟频率
	QueryPerformanceFrequency(&litmp);//获得时钟频率
	dff=(double)litmp.QuadPart;

	//获得初始值
	QueryPerformanceCounter(&litmp);
	qt1=litmp.QuadPart;

	//下面一些耗时的操作
	Sleep(1);

	//获得终止值
	QueryPerformanceCounter(&litmp);
	qt2=litmp.QuadPart;

	//获得对应的时间值,转到毫秒单位上
	dfm=(double)(qt2-qt1);
	dft=dfm/dff;


	printf("用时: %.3f 毫秒\n", dft*1000.0);
}

我的机器上为Sleep(1) = 0.454ms; Sleep(10) = 9.719ms;Sleep(100) = 99.541ms


下面是另外两种供参考:


#include <stdio.h>
#include <Windows.h>
#include <Mmsystem.h>
#include "timer.h"

#pragma comment(lib, "winmm.lib")


int i = 0;
DWORD start;
DWORD end;

#define  TIMES	(1000)

void main()
{
	
	//
	// 1.	使用高精度定时器初始化
	//
	//高精度定时器初始化
	//	注意: 如果不执行下面的初始化为1ms的语句,将影响Sleep()的精度
	::timeBeginPeriod(1);
	Sleep(100);

	//开始计时
	start = ::timeGetTime();
	for (i=0; i<TIMES; i++)//累计测试
	{
		Sleep(1);
	}

	//结束计时
	end = ::timeGetTime();
	printf("使用高精度定时器测试Sleep(1)时间: %.3f ms\n", (end-start)/((double)TIMES));




	
	//
	// 2. 使用CPU周期数方式获取
	//
	KTimer timer;

	//下面获取CPU的速度(MHz)
    timer.Start(); 
	Sleep(1000); 
    unsigned __int64 cpuspeed = (unsigned)(timer.Stop()/1000000);
	printf("CPU速度: %I64d MHz\n", cpuspeed);


	//开始测试
    timer.Start(); 

	Sleep(1);

	//结束
    unsigned __int64 time = (unsigned) timer.Stop();
	printf("使用CPU周期数测得Sleep(1)时间: %I64d μs\n", time/cpuspeed);


	//
	// 测试完毕后,将定时精度调回来
	//
	::timeEndPeriod(1);


}


 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值