zoukankan      html  css  js  c++  java
  • 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 毫秒 ", 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 ", (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 ", 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 ", time/cpuspeed);  
    61.   
    62.   
    63.     //  
    64.     // 测试完毕后,将定时精度调回来  
    65.     //  
    66.     ::timeEndPeriod(1);  
    67.   
    68.   
    69. }  
  • 相关阅读:
    青山一别
    Spring Mvc Long类型精度丢失
    Spring 版MediatR--中介者模式实现库
    Spring 实现策略模式--自定义注解方式解耦if...else
    spring泛型注入
    Spring Boot Mvc 统一返回结果
    简化mapstruct代码: mapstruct-spring-plus
    .NET后端开发编码规范
    深度优先遍历(DFS)和广度优先遍历(BFS)的实现与简单应用
    将HTML字符串编译为虚拟DOM对象的基础实现
  • 原文地址:https://www.cnblogs.com/lvdongjie/p/4500777.html
Copyright © 2011-2022 走看看