Lv.的博客

Win32函数Sleep的精度测试

 

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

先看第一种:

 

[cpp] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. #include <windows.h>  
  2. #include <stdio.h>  
  3.   
  4. void main()  
  5. {  
  6.     LARGE_INTEGER litmp;  
  7.     LONGLONG qt1,qt2;  
  8.     double dft,dff,dfm;  
  9.   
  10.     //获得时钟频率  
  11.     QueryPerformanceFrequency(&litmp);//获得时钟频率  
  12.     dff=(double)litmp.QuadPart;  
  13.   
  14.     //获得初始值  
  15.     QueryPerformanceCounter(&litmp);  
  16.     qt1=litmp.QuadPart;  
  17.   
  18.     //下面一些耗时的操作  
  19.     Sleep(1);  
  20.   
  21.     //获得终止值  
  22.     QueryPerformanceCounter(&litmp);  
  23.     qt2=litmp.QuadPart;  
  24.   
  25.     //获得对应的时间值,转到毫秒单位上  
  26.     dfm=(double)(qt2-qt1);  
  27.     dft=dfm/dff;  
  28.   
  29.   
  30.     printf("用时: %.3f 毫秒\n", dft*1000.0);  
  31. }  

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

 

 

下面是另外两种供参考:

 

[cpp] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. #include <stdio.h>  
  2. #include <Windows.h>  
  3. #include <Mmsystem.h>  
  4. #include "timer.h"  
  5.   
  6. #pragma comment(lib, "winmm.lib")  
  7.   
  8.   
  9. int i = 0;  
  10. DWORD start;  
  11. DWORD end;  
  12.   
  13. #define  TIMES  (1000)  
  14.   
  15. void main()  
  16. {  
  17.     ////////////////////////////////////////////////////////////////////////////////  
  18.     //  
  19.     // 1.   使用高精度定时器初始化  
  20.     //  
  21.     //高精度定时器初始化  
  22.     //  注意: 如果不执行下面的初始化为1ms的语句,将影响Sleep()的精度  
  23.     ::timeBeginPeriod(1);  
  24.     Sleep(100);  
  25.   
  26.     //开始计时  
  27.     start = ::timeGetTime();  
  28.     for (i=0; i<TIMES; i++)//累计测试  
  29.     {  
  30.         Sleep(1);  
  31.     }  
  32.   
  33.     //结束计时  
  34.     end = ::timeGetTime();  
  35.     printf("使用高精度定时器测试Sleep(1)时间: %.3f ms\n", (end-start)/((double)TIMES));  
  36.   
  37.   
  38.   
  39.   
  40.     ////////////////////////////////////////////////////////////////////////////////  
  41.     //  
  42.     // 2. 使用CPU周期数方式获取  
  43.     //  
  44.     KTimer timer;  
  45.   
  46.     //下面获取CPU的速度(MHz)  
  47.     timer.Start();   
  48.     Sleep(1000);   
  49.     unsigned __int64 cpuspeed = (unsigned)(timer.Stop()/1000000);  
  50.     printf("CPU速度: %I64d MHz\n", cpuspeed);  
  51.   
  52.   
  53.     //开始测试  
  54.     timer.Start();   
  55.   
  56.     Sleep(1);  
  57.   
  58.     //结束  
  59.     unsigned __int64 time = (unsigned) timer.Stop();  
  60.     printf("使用CPU周期数测得Sleep(1)时间: %I64d μs\n", time/cpuspeed);  
  61.   
  62.   
  63.     //  
  64.     // 测试完毕后,将定时精度调回来  
  65.     //  
  66.     ::timeEndPeriod(1);  
  67.   
  68.   
  69. }  
posted @ 2015-05-13 16:14  Avatarx  阅读(2433)  评论(0编辑  收藏  举报