Windows-如何在Windows实现微秒级的准确定时?

Windows-如何在Windows实现微秒级的准确定时?

偏爱自由 发布于 2017-11-06 字数 126 浏览 1416 回复 6

在Windows上,对时间测量精度比较高的场合,用GetTickCount返回的时间都是毫秒,如果要求更高的精度,比如微秒级,要如何实现?

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

夜无邪 2017-11-09 6 楼

同意@陈彦旭 @Marks周

泛泛之交 2017-11-08 5 楼

这里有众多的定时算法:VC中基于 Windows 的精确定时

摘录一个1微秒的精确定时实现:

LARGE_INTEGER litmp;
LONGLONG QPart1, QPart2;
double dfMinus, dfFreq, dfTim;
QueryPerformanceFrequency(&litmp);
dfFreq = (double)litmp.QuadPart;// 获得计数器的时钟频率
QueryPerformanceCounter(&litmp);
QPart1 = litmp.QuadPart;// 获得初始值
do {
QueryPerformanceCounter(&litmp);
QPart2 = litmp.QuadPart;//获得中止值
dfMinus = (double)(QPart2-QPart1);
dfTim = dfMinus / dfFreq;// 获得对应的时间值,单位为秒
}while(dfTim<0.000001);

清晨说ぺ晚安 2017-11-08 4 楼

一、你的需求需要微秒吗?
二、Windows系统中根本不存在微秒的计时,但存在对毫秒的精确定时,这是由BIOS系统的脉冲电流决定的,除非你自己做一块有原子钟的芯片。
三、如果微秒真的可以测出那么微软为什么不将微秒加上去?

虐人心 2017-11-08 3 楼

在时间测量的时候,也需要考虑调用的时间消耗。这个地方 Implement a Continuously Updating, High-Resolution Time Provider for Windows 讨论了这个问题。

瑾兮 2017-11-07 2 楼

其实 QueryPerformanceCounter 是用汇编指令rdtsc实现的,直接使用这个指令,计算精确。rdtsc用来获得CPU自开机运行的时间周期数,是64位的,保存在eax(地位)和edx(高位)中。结合 QueryPerformanceFrequency (获得机器内部定时器的时钟频率),计算时间间隔。
例如以下利用 rdtsc 实现反调试功能(几条指令执行时间长就认为是有人在调试执行):

rdtsc
mov ecx,eax
mov ebx,edx

//一些代码
//计算两次rdtsc指令之间的时间差
rdtsc

cmp edx,ebx //检测高位
ja  _debugger_found
sub eax,ecx //检测低位
cmp eax,0x200
ja _debugger_found
泛泛之交 2017-11-07 1 楼

windows本身不是实时系统,做到绝对的准是不可能的,以前做视频编解码的时候,要做高质量的视频,都依赖硬件视频编码芯片自己的硬件时钟。