Nik*_*hil 16 c++ windows time boost
如何在Windows上获得微秒级分辨率时间戳?
我正在寻找比QueryPerformanceCounter
和更好的东西QueryPerformanceFrequency
(这些只能给你一个自启动以来经过的时间,并且如果在不同的线程上调用它们不一定准确 - 也就是说,QueryPerformanceCounter
可能在不同的CPU上返回不同的结果.还有一些处理器可以调整他们的节电频率,显然并不总是反映在他们的QueryPerformanceFrequency
结果中.)
有实现一个不断更新,高分辨率时间为Windows提供者,但它似乎并不稳固.当微秒问题看起来很棒,但它不能再下载了.
另一个资源是在Windows XP下获取准确的时间戳,但它需要许多步骤,运行辅助程序加上一些初始化的东西,我不确定它是否适用于多个CPU.
我还查看了维基百科文章时间戳计数器,它很有趣,但没那么有用.
如果答案只是用BSD或Linux来做,那就更容易了,这很好,但我想确认一下,并解释为什么在Windows中这么难以在Linux和BSD中这么容易.这是相同的精品硬件......
And*_*ass 19
我相信这仍然有用:系统内部:提供多媒体计时器支持的指南.
它很好地解释了各种可用的定时器及其局限性.可能你的大敌不是那么多决议,而是延迟.
QueryPerformanceCounter并不总是以CPU速度运行.实际上,它可能会尝试避免使用RDTSC,尤其是在多处理器(/多核)系统上:它将在Windows Vista及更高版本(如果可用)或ACPI/PM计时器上使用HPET.在我的系统(Windows 7 x64,双核AMD)上,定时器运行在14.31818 MHz.
默认情况下,Windows Server 2003 Service Pack 2(SP2)将PM计时器用于所有多处理器APIC或ACPI HAL,除非用于确定BIOS是否支持APIC或ACPI HAL的检查过程失败.
问题是,检查失败时.这只是意味着您的计算机/ BIOS在某种程度上被破坏了.然后你可以修复你的BIOS(推荐),或至少暂时切换到使用ACPI计时器(/ usepmtimer).
很容易从C# - 没有P/Invoke - 检查高分辨率计时器支持,Stopwatch.IsHighResolution
然后查看Stopwatch.Frequency
.它将在内部进行必要的QueryPerformanceCounter调用.
还要考虑一下,如果计时器坏了,整个系统就会受到严重破坏,一般来说,表现得很奇怪,报告负经过时间,放慢速度等等 - 而不仅仅是你的应用程序.
这意味着您实际上可以依赖QueryPerformanceCounter.
......与普遍看法相反,QueryPerformanceFrequency()
"在系统运行时不能改变".
编辑:作为关于QueryPerformanceCounter()
状态的文档,"调用哪个处理器应该无关紧要" - 事实上,只有在APIC/ACPI检测失败并且系统使用TSC时才需要整个线程关联.这是一个不应该发生的度假胜地.如果它发生在较旧的系统上,则可能是制造商提供的BIOS更新/驱动程序修复.如果没有,那么/usepmtimer
启动开关仍然存在.如果这也失败了,因为系统除了奔腾TSC之外没有合适的计时器,你实际上可能会考虑搞乱线程亲和力 - 即使这样,其他人在页面的"社区内容"区域提供的样本也是如此.由于在每次启动/停止呼叫时设置了线程关联性,因此它具有不可忽略的开销,这会产生误导性 - 这会引入相当大的延迟并且可能会降低首先使用高分辨率计时器的好处.
Game Timing和Multicore Processors是关于如何正确使用它们的建议.请考虑它现在已经有五年了,当时更少的系统完全符合ACPI标准/支持 - 这就是为什么在抨击它时,文章详细介绍了TSC以及如何通过保持仿射来解决其局限性线.
我认为现在找到一个没有ACPI支持并且没有可用的PM计时器的普通PC是一项相当艰巨的任务.最常见的情况可能是BIOS设置,当ACPI支持设置不正确时(有时可能出乎工厂默认设置).
轶事告诉我们,八年前,情况在极少数情况下有所不同.(做一个有趣的阅读,开发人员围绕设计"缺点"和抨击芯片设计师.公平地说,它可能是相同的反之亦然.:-)
mat*_*att 11
QueryPerformanceCounter/QueryPerformanceFrequency,处理器速度分辨率
小心多线程.处理器上的每个核心都可以拥有自己的计数器.
更多信息是在Windows XP下获取准确的时间戳.
如果你最终不得不采用这种方法:
当我尝试手动将数据写入串行端口(用于红外发射器)时,我发现将进程和线程优先级设置为最大值(实时)大大提高了其可靠性(因为没有错误),这是必须的如果我也记得,它的分辨率大约为40 kHz,所以它应该足够精确到毫秒分辨率.
Windows不是实时操作系统.
多任务操作系统上的进程需要将时间转移到另一个线程/进程.这给定时带来了一些开销.
每个函数调用都会产生开销,因此在返回请求时会有一点延迟.
此外,调用系统调用将需要您的进程从用户空间模式切换到具有相对较高延迟的内核空间模式.您可以通过在内核模式下运行整个过程(例如设备驱动程序代码)来克服这个问题.
一些操作系统,如Linux或BSD,更好,但它们仍然无法将精确的时序分辨率维持在亚微秒(例如,Linux 上nanosleep()的准确度约为1毫秒,不低于1毫秒),除了你将内核修补到一些特定的调度程序,为您的应用程序带来好处.
所以我认为,最好调整您的应用程序以遵循这些问题,例如经常重新校准您的计时例程,这是您的链接提供的.AFAIK,Windows的最高计时器分辨率仍然是GetPerformanceCounter/Frequency(),无论其准确性如何.通过在单独的线程中运行计时器池例程,并将该线程关联设置为一个核心处理器,并将线程优先级设置为您可以获得的最高优先级,可以获得更高的准确性.
QueryPerformanceCounter是对此的正确解决方案.与您和某些人回答您所写的内容相反,即使使用多处理器系统,此调用也会给出正确的答案(除非系统被破坏),并且它甚至可以处理更改的CPU频率.在大多数现代系统中,它来自RDTSC,但为您处理所有这些多CPU和频率变化的细节.(但它比RDTSC慢得多).
在多处理器计算机上,调用哪个处理器无关紧要.但是,由于基本输入/输出系统(BIOS)或硬件抽象层(HAL)中的错误,您可以在不同的处理器上获得不同的结果.
归档时间: |
|
查看次数: |
17967 次 |
最近记录: |