在多核心或多处理器的计算机上,特别是在支持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. 和达摩院深度绑定,阿里云下一个十年,成为“云上的阿里巴巴”
  2. LeetCode 137. Single Number II--三次异或消除相同的数--C++,Python解法
  3. 【JSTL】--c:out演示--drp213
  4. Java 过滤器解决URLSQL注入漏洞、跨站漏洞、框架注入漏洞、链接注入漏洞
  5. 《Effective.Enterprise.Java中文版》知识点摘要
  6. Zookeeper----基本原理
  7. Spring Cloud 微服务实战系列-Spring Boot再次入门(二)
  8. sql server 迁移 mysql_sql server 迁移到 mysql
  9. 职场真正的潜规则,毕业生却一直不重视!还自以为是的认为这是优点!!HR直接会pass这一群人!!
  10. RabbitMq使用demo
  11. 百度js推送没法用了?帝国CMS结合百度API推送方法来了
  12. python代码写名字_python代码实现给儿子儿女取名字
  13. 个人电脑秒变服务器 简单几步,你的电脑也可以成为服务器 (内网穿透)
  14. Java学习总结3——枚举类和反射机制
  15. 0-1背包问题和背包问题
  16. Ping 命令详解(含真实操作截图)
  17. 南京移动开发者沙龙(创业邦+果合)
  18. 斗鱼虎牙合并:从内耗走向一致抗敌
  19. 【Python金融量化 9- 100 】九、预测股票收益方法总结
  20. 网络与信息安全基础知识(软考中级)

热门文章

  1. Error:warning: Ignoring InnerClasses attribute for an anonymous inner class
  2. Linux系统中创建大文件,并作为文件系统使用
  3. Ubuntu 安装 OpenCV4 详细步骤
  4. Dell 戴尔预装Windows8改成Windows7
  5. Centos 6启动流程详解
  6. Python - selenium_WebDriver 鼠标键盘事件
  7. Caliburn.Micro 资源随时添加
  8. blackberry Jvm error 104 错误(Device Simulator)
  9. Window10安装pycocotools
  10. python类方法调用装饰_Python3 @classmethod 函数装饰器 声明一个类方法