您的位置:首页 > 其它

Win32函数Sleep的精度测试

2015-05-13 16:14 316 查看

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

先看第一种:

[cpp] view plaincopy





#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

下面是另外两种供参考:

[cpp] view plaincopy





#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);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: