现在的位置: 首页 > 自动控制 > 工业·编程 > 正文

Win32函数Sleep的精度测试

2014-01-08 22:19 工业·编程 ⁄ 共 1157字 ⁄ 字号 暂无评论

用了两种方法,一种是使用多媒体定时器,另一种是《Windows图形编程》里提供的CPU周期来获取:

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

给我留言

留言无头像?