Windows下获取高精度时间注意事项

Windows下获取高精度时间注意事项 [转贴 AdamWu]

花了很长时间才得到的经验,与大家分享。

1. RDTSC - 粒度: 纳秒级 不推荐
优势: 几乎是能够获得最细粒度的计数器
抛弃理由:

A) 定义模糊
 - 曾经据说是处理器的cycle counter,但是后来似乎又不是了。
有的机器上每秒的TSC增长值等于CPU频率,有的却是一个不对应任何配置的数。到底是什么,Intel也没解释清楚。

B) 不准确
 - 这是最重大的缺陷。再细的粒度,不准的话也没用,至少不能当时间用。
在有的CPU上,特别是支持变频技术的笔记本CPU上,TSC增长值会随着CPU的频率改变。忙的时候跑得快,闲得时候跑得慢。

2. QueryPerformanceCounter - 粒度: 1~100微秒级 不推荐
优势: 尽管比RDTSC粒度稍低,但是不存在RDTSC在变频CPU上的问题。
 知道这个API的人估计都倾向于用这个,因为M$对这个API给出了比较明确的定义,就是每秒钟某个计数器增长的数值。
抛弃理由: 还是不准确

尽管没有源代码,但是从M$的帮助文档和知识库可以了解到,PerformanceCounter是依赖于主板上与PCI设备有关联的硬件。这就意味着,PerformanceCounter的结果还是会受到硬件频率,特别是总线频率的影响。

事实上,我在EeePC上测试的时候就发现,系统采用节能模式的时候PerformanceCounter出来的结果老是偏慢很多,超频模式的时候又偏快,而且用电池和接电源的时候效果还不一样!

3. timeGetTime - 粒度: 毫秒级 推荐
尽管粒度进一步降低,但是其无与伦比的优势就是,准确。
在任何机器上返回的都是当前系统的启动时间,精确到1毫秒。

使用注意事项:

A) 在NT系统上(据说)默认精度为10ms,但是可以用timeBeginPeriod来降低到1ms
 B) 返回的是一个32位整数,所以要注意大约每49.71天会出现归零(不像前两个是64位数,要几百年才会归零)。

参考:http://www.cnblogs.com/AnyDelphi/archive/2009/05/14/1456716.html

时间: 2024-10-16 21:46:02

Windows下获取高精度时间注意事项的相关文章

.net平台下获取高精度时间类

原文:http://www.it118.org/specials/321869dd-98cb-431b-b6d2-82d973cd739d/d940a15c-0d36-4369-8de0-b07cf3f3fd5f.htm 前言:.NET 2.0前运行库中不存在高精度的计时器,而您又需要它,解决的方法是通过调用QueryPerformanceFrequency 和 QueryPerformanceCounter这两个Win32 API来实现.在.NET 2.0时,stopwatch类也可实现高精度

【转载】c/c++在windows下获取时间和计算时间差的几种方法总结

一.标准C和C++都可用 1.获取时间用time_t time( time_t * timer ),计算时间差使用double difftime( time_t timer1, time_t timer0 ). 精确到秒. 测试程序如下: #include <time.h> #include <stdio.h> int main() { time_t start ,end ; double cost; time(&start); sleep(1); time(&en

c和c++在windows下获取时间和计算时间差的方法总结

c/c++在windows下获取时间和计算时间差的几种方法总结 一.标准C和C++都可用 1.获取时间用time_t time( time_t * timer ),计算时间差使用double difftime( time_t timer1, time_t timer0 ). 精确到秒. 测试程序如下: 1 #include <time.h> 2 #include <stdio.h> 3 4 int main() 5 { 6 time_t start, end; 7 double c

windows 下获取当前进程的线程数量

#include <TlHelp32.h> int get_thread_amount() { int i = 0; char Buff[9]; PROCESSENTRY32 pe32; pe32.dwSize = sizeof(pe32); int processid = GetCurrentProcessId(); HANDLE hProcessSnap = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if (hProcessSna

Linux下获取当前时间到1970年之前某年份的秒数的C代码实现

一.问题描述 在Linux下编写一C程序,用于获取当前时间到1970年之前某年份的秒数. 二.C代码实现 /********************************************************************* * 版权所有 (C)2015, Zhou Zhaoxiong. * * 文件名称:GetSecNumBetweenTwoYear.c * 文件标识:无 * 内容摘要:获取当前时间到1970年之前某时间的秒数 * 其它说明:无 * 当前版本:V1.0 *

windows下获取硬盘信息的命令

2020-1-17windows下获取硬盘序列号===================================winkey run cmdMicrosoft Windows [版本 10.0.18363.592](c) 2019 Microsoft Corporation.保留所有权利.方法1:C:\Users\Administrator>wmic diskdrive get serialnumberSerialNumberW3PC29KQ 方法2:C:\Users\Administra

windows下docker使用及注意事项

1.windows container模式下,pull镜像会失败 no matching manifest for windows/amd64 in the manifest list entries 2.windows container模式下会存在问题,再次切换到linux container模式下,启动会出现问题 out of memory 3.解决memory问题 右击docker状态栏的图标,选择设置(settings),再将advanced下的memory从2048修改为1280,自

Windows下获取Dump文件以及进程下各线程调用栈的方法总结(转)

1. Dump文件的用途 Dump文件, 主要用于诊断一个进程的运行状态,尤其是碰到崩溃(Crash)或者挂起(hang)不响应时,需要分析它的工作状态.  除了平时常见的attach到这个进程, 分析Dump文件就成了一个重要的手段了. 相信一些做软件维护和支持的工程师在这方面深有体会, 比如某天某时,客户说, 呀, 糟糕, 服务器进程挂掉了, 怎么回事? 然后,看看了日志文件,也没有什么可用的信息.  技术支持告诉他, 按某步骤生成一个dump文件来看看...... 2. 如何生成Dump文

python 下获取系统时间并格式化输出

python下面有两个时间的模块,time和datetime,当然在使用的时候都需要先import. 获得系统当前时间time.localtime(time.time()) 时间的格式化输出可以使用time下的strftime,调用为time.strftime() 例子为current_time=time.strftime('%Y-%m-%d',time.localtime(time.time())) 输出的时间格式为2015-02-11,这个输出是一个string类型的数据 还有datatim