在多核心或多处理器的计算机上,特别是在支持CPU频率动态调整的计算机上,windows系统下的QueryPerformanceFrequency()获取HPET(如果存在)的频率,而QueryPerformanceCounter()获取HPET(如果存在高精度事件定时器(High Precision Event Timer))自上电以来时钟周期数,与CPU频率无关。前一个函数不会因为线程运行所在的CPU不同或CPU的频率在不同时刻的差异而反馈不同的值,系统上电初始化以后便不会改变,后一个函数的源也是统一的。这样便可以精确计算目标程序,特别是多线程程序的性能。

如果想获得CPU的默认信息,包括制造商,版本号,默认频率等等,请使用:__cpuid()。如果想获得当前CPU的实际频率,请获取系统当前基频和倍频然后计算得到。

           注:但是这和程序具体的运行环境有关,程序运行的流畅顺利就所用的时间就短,程序运行的环境不好,持续时间久很长。

           故虽然可以实现高精度定时计数,但是程序的执行时间还是和运行环境有关,无法做到精确测量。

精确获取时间:

QueryPerformanceFrequency() - 基本介绍

类型:Win32API

原型:BOOL QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency);

作用:返回硬件支持的高精度计数器的频率。

返回值:非零,硬件支持高精度计数器;零,硬件不支持,读取失败。

QueryPerformanceFrequency() - 技术特点

供WIN9X使用的高精度定时器:QueryPerformanceFrequency()和QueryPerformanceCounter(),要求计算机从硬件上支持高精度定时器。需包含windows.h头文件。

函数的原形是:

BOOL QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency);

BOOL QueryPerformanceCounter (LARGE_INTEGER *lpCount);

数据类型LARGEINTEGER既可以是一个作为8字节长的整数,也可以是作为两个4字节长的整数的联合结构,其具体用法根据编译器是否支持64位而定。该类型的定义如下:

typeef union _ LARGE_INTEGER

{

struct

{

DWORD LowPart;

LONG HighPart;

};

LONGLONG QuadPart;

} LARGE_INTEGER;

在定时前应该先调用QueryPerformanceFrequency()函数获得机器内部计时器的时钟频率。接着在需要严格计时的事件发生前和发生之后分别调用QueryPerformanceCounter(),利用两次获得的计数之差和时钟频率,就可以计算出事件经历的精确时间。

测试Sleep的精确时间:

#include <stdio.h>

#include <windows.h>

void main()

{

LARGE_INTEGER nFreq;

LARGE_INTEGER nBeginTime;

LARGE_INTEGER nEndTime;

double time;

QueryPerformanceFrequency(&nFreq);

QueryPerformanceCounter(&nBeginTime);

Sleep(1000);

QueryPerformanceCounter(&nEndTime);

time=(double)(nEndTime.QuadPart-nBeginTime.QuadPart)/(double)nFreq.QuadPart;

printf("%f\n",time);

Sleep(1000);

system("Pause");

}

结果为

0.999982

1.000088

1.000200

等,所以Sleep的精度还是比较低的。

QueryPerformanceFrequency用法--Windows高精度定时计数相关推荐

  1. QueryPerformanceFrequency使用方法--Windows高精度定时计数

    在多核心或多处理器的计算机上.特别是在支持CPU频率动态调整的计算机上,windows系统下的QueryPerformanceFrequency()获取HPET(假设存在)的频率,而QueryPerf ...

  2. windows xp 定时执行任务(一)

    windows xp 定时执行任务(一) http://lyflinux.blog.sohu.com/100371784.html schtasks /create /sc minute /mo 20 ...

  3. Windows服务器定时重启设置教程

    Windows服务器定时重启设置教程 Windows系统的任务计划程序,可以添加计划任务,设置任务开始时间及执行的间隔,实现应用的自动执行.例如:实现定时重启.关机等常见的功能.如何使用参考以下步骤 ...

  4. Linux/windows系统定时任务调度总结

    定时任务是办公自动化中比较重要的一环. Linux/windows系统定时任务调度总结 概述 服务启动和关闭 任务调度全局配置 用户配置文件 crontab定时任务格式 crontab定时任务实例 时 ...

  5. Windows xp 定时关机命令

    Windows xp 定时关机命令 Windows XP的关机是由Shutdown.exe程序来控制的,位于Windows"System32文件夹中.如 果想让Windows 2000也实现 ...

  6. Windows 7定时关机命令shutdown

    在 Win7 中,shutdown实现自动关机的方法如下: [方法一:计划任务法] 开始>>> 在搜索框输入cmd >>> 回车 >>> 调出DO ...

  7. 中断系统与定时/计数计时器

                1. 外部中断 1.1统计 INT0 的脉冲触发的个数,满10个,则停止统计将P1.0清0 ORG 0000H LJMP START ORG 0003H LJMP EXINT0 ...

  8. Windows每天定时启动应用程序

    Windows每天定时启动应用程序 1.win+R打开此窗口,输入compmgmt.msc 2.创建一个基本任务 3.配置任务 使用bat文件进行应用程序的定时启动与关闭 @echo off chcp ...

  9. STM32定时器配置(TIM1、TIM2、TIM3、TIM4、TIM5、TIM8)高级定时器+普通定时器,定时计数模式下总结

    STM32定时器配置(TIM1.TIM2.TIM3.TIM4.TIM5.TIM8)高级定时器+普通定时器,定时计数模式下总结 文章结构: --> 一.定时器基本介绍 --> 二.普通定时器 ...

最新文章

  1. JDK 1.5 新特性——自动拆箱装箱
  2. SSL与OpenSSL介绍
  3. makefile文件编写_九图记住Makefile
  4. Exchange 2007 安裝(-)
  5. oracle指定源位置怎么弄,ORACLE Goldengate测试解决源端和目标端表结构字段位置不同的2种实现方法...
  6. java list map 去重复_如何过滤ListMapString,Object 中的重复Map
  7. “金牛智慧城市”APP上线 一键可查找公厕和公园
  8. 防止自建控件与页面间重复引入客户端js脚本的方法
  9. 【Python函数优化】
  10. ROS学习(13)自定义机器人的ROS导航
  11. windows 错误代码2
  12. request.session使用途径
  13. Java基础知识(十) 多线程
  14. userAgent判断客户端,以及各个浏览器的ua
  15. Linux系统的定时任务
  16. 从零学前端第十七讲:小程序开发
  17. 如何解决Kodi的YouTube“配额超过”问题
  18. 计算机网络协议(五)——DNS、HTTPDNS
  19. 协作图(Collaboration diagram)——UML之图七
  20. 闲来无事,造了一个物联IOT平台

热门文章

  1. CSS盒模型( CSS margin 属性)
  2. android Canvas 最基础知识总结
  3. 解剖JavaScript中的null和undefined
  4. 一篇文章让你读懂Pivotal的GemFire家族产品
  5. c语言程序设教材计 乌云高娃,C语言程序设计教学课件作者第3版乌云高娃演示文稿C语言程序设计教学课件作者第3版乌云高娃演示文稿演示文稿第1章C语言程序设计基础课件.ppt...
  6. Linux下三个密码生成工具
  7. 怎么将jenkins打包后的war自动部署到jetty上?
  8. java实现时间的比较
  9. gen_event中的handler和supervised handler
  10. 变更控制管理流程图_干货丨项目管理流程及绘制规范要点