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

先看第一种:

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

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

下面是另外两种供参考:

  1. #include <stdio.h>
  2. #include <Windows.h>
  3. #include <Mmsystem.h>
  4. #include "timer.h"
  5. #pragma comment(lib, "winmm.lib")
  6. int i = 0;
  7. DWORD start;
  8. DWORD end;
  9. #define  TIMES  (1000)
  10. void main()
  11. {
  12. ////////////////////////////////////////////////////////////////////////////////
  13. //
  14. // 1.   使用高精度定时器初始化
  15. //
  16. //高精度定时器初始化
  17. //  注意: 如果不执行下面的初始化为1ms的语句,将影响Sleep()的精度
  18. ::timeBeginPeriod(1);
  19. Sleep(100);
  20. //开始计时
  21. start = ::timeGetTime();
  22. for (i=0; i<TIMES; i++)//累计测试
  23. {
  24. Sleep(1);
  25. }
  26. //结束计时
  27. end = ::timeGetTime();
  28. printf("使用高精度定时器测试Sleep(1)时间: %.3f ms\n", (end-start)/((double)TIMES));
  29. ////////////////////////////////////////////////////////////////////////////////
  30. //
  31. // 2. 使用CPU周期数方式获取
  32. //
  33. KTimer timer;
  34. //下面获取CPU的速度(MHz)
  35. timer.Start();
  36. Sleep(1000);
  37. unsigned __int64 cpuspeed = (unsigned)(timer.Stop()/1000000);
  38. printf("CPU速度: %I64d MHz\n", cpuspeed);
  39. //开始测试
  40. timer.Start();
  41. Sleep(1);
  42. //结束
  43. unsigned __int64 time = (unsigned) timer.Stop();
  44. printf("使用CPU周期数测得Sleep(1)时间: %I64d μs\n", time/cpuspeed);
  45. //
  46. // 测试完毕后,将定时精度调回来
  47. //
  48. ::timeEndPeriod(1);
  49. }

Win32函数Sleep的精度测试的更多相关文章

  1. C# 互操作性入门系列(二):使用平台调用调用Win32 函数

    好文章搬用工模式启动ing ..... { 文章中已经包含了原文链接 就不再次粘贴了 言明 改文章是一个系列,但只收录了2篇,原因是 够用了 } --------------------------- ...

  2. [转]C# 互操作性入门系列(二):使用平台调用调用Win32 函数

    传送门 C#互操作系列文章: C# 互操作性入门系列(一):C#中互操作性介绍 C# 互操作性入门系列(二):使用平台调用调用Win32 函数 C# 互操作性入门系列(三):平台调用中的数据封送处理 ...

  3. 关于 pgsql 数据库json几个函数用法的效率测试

    关于 pgsql 数据库json几个函数用法的效率测试 关于pgsql 几个操作符的效率测试比较1. json::->> 和 ->> 测试方法:单次运行100次,运行10个单次 ...

  4. 在C#中调用Win32函数EnumWindows枚举所有窗口。

    原文 http://www.cnblogs.com/mfm11111/archive/2009/06/30/1514322.html 开发旺旺群发软件,难点及重要技术点分析(一) 一.        ...

  5. JavaScript回调函数及数组方法测试

    JavaScript回调函数及数组方法测试 具体代码如下: <!DOCTYPE html> <html lang="en"> <head> &l ...

  6. elasticsearch 聚合函数 max double精度损失bug

    测试样例数据{ "size" : 0, "query" : { "bool" : { "must" : { " ...

  7. PHP Socket 编程之9个主要函数的使用之测试案例

    php的socket编程算是比较难以理解的东西吧,不过,我们只要理解socket几个函数之间的关系,以及它们所扮演的角色,那么理解起来应该不是很难了,在笔者看来,socket编程,其实就是建立一个网络 ...

  8. TRUNC函数,ORA-01898 精度说明符过多

    TRUNC(SYSDATE)即可默认当前日期(年月日),TRUNC(SYSDATE,'yyyy-mm-dd'),精度说明符过多

  9. C# 中使用win32函数 GetScrollInfo返回false 返回引用全是零的问题

    最近做一个项目要获得ScrollBar的位置,因为.net找不到此类功能,只好用MFC中的函数了,GetScrollPos只返回listview顶部的位置,此时我找到了GetScrollInfo,觉得 ...

随机推荐

  1. asp.net微信开发第六篇----高级群发(文本)

    说到高级群发,微信的参考资料http://mp.weixin.qq.com/wiki/14/0c53fac3bdec3906aaa36987b91d64ea.html 首先我们先来讲解一下群发文本信息 ...

  2. gitHub项目框架使用排名

    项目名称 项目简介                                  使用心得                1. react-native 这 个是 Facebook 在 React ...

  3. Android Translate 动画跳跃和缓慢移动

    1.动画跳跃:在动画结束的时候设置位置 Animation.AnimationListener listener = new Animation.AnimationListener() { @Over ...

  4. Windows7电脑上不去网,ipconfig查询时默认网关会出现0.0.0.0问题的解决

    用ipconfig查看网络配置,发现其他都正确,唯独默认网关上多了一条0.0.0.0的记录,.禁用网络连接再启用也不能恢复.网上找了一下有说改注册表的,打开注册表找到 HKEY_LOCAL_MACHI ...

  5. DHCP Relay 简介

    DHCP Relay(DHCPR)DHCP中继 也叫做DHCP中继代理 如果DHCP客户机与DHCP服务器在同一个物理网段,则客户机可以正确地获得动态分配的ip地址.如果不在同一个物理网段,则需要DH ...

  6. oracle where与having

    where与having可以过滤,一般来说尽量使用where ,但是如果过滤条件中有组函数,只能使用having SQL> select deptno,avg(sal) from emp gro ...

  7. HashTable 及应用

    HashTable-散列表/哈希表,是根据关键字(key)而直接访问在内存存储位置的数据结构. 它通过一个关键值的函数将所需的数据映射到表中的位置来访问数据,这个映射函数叫做散列函数,存放记录的数组叫 ...

  8. QT学习:入门篇(三)

    头文件: #ifndef CChatDisplaySet_h #define CChatDisplaySet_h #include "QtGui/QDialog" #include ...

  9. JavaScript 禁用键盘按钮

    代码写多了,有些使用过的方法和技巧会一时半会想不起来,平日记录下来,方便自己和有需要的人日后查阅. $(document).keydown(function () { if (window.event ...

  10. js中将函数传递给另一个函数的解析(非常容易理解)

    $(document).ready(function(){ //JS中关于把函数作为函数的参数来传递的问题的小总结//第一,最简单的形式无参函数,直接形式函数的函数名放到括号中,再在执行部分这个函数即 ...