gpt4 book ai didi

c++ - 计时器精度 : c clock( ) vs. WinAPI 的 QPC 或 timeGetTime( )

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:04:47 25 4
gpt4 key购买 nike

我想描述软件计时器的准确性。我不太关心它有多准确,但确实需要知道准确度是多少。

我研究了 c 函数 clock() 和 WinAPI 的函数 QPC 和 timeGetTime,我知道它们都依赖于硬件。

我正在测量一个可能需要大约 5-10 秒的过程,我的要求很简单:我只需要 0.1 秒的精度(分辨率)。但我确实需要知道最坏情况下的准确度。

虽然更高的准确性是首选,但我宁愿知道准确性很差(500 毫秒)并解释它,也不愿相信准确性更好(1 毫秒)但无法记录它。

有人对如何表征软件时钟精度有什么建议吗?

谢谢

最佳答案

您需要区分准确性、分辨率和延迟。

clock()、GetTickCount 和 timeGetTime() 源自经过校准的硬件时钟。分辨率不是很好,它们由时钟滴答中断驱动,默认情况下每秒滴答 64 次或每 15.625 毫秒滴答一次。您可以使用 timeBeginPeriod() 将其降低到 1.0 毫秒。准确性非常好,时钟是从 NTP 服务器校准的,您通常可以指望它在一个月内不会超过一秒。

QPC 具有更高的分辨率,总是优于 1 微秒,在某些机器上甚至低至半纳秒。然而,它的准确性很差,时钟源是从某处芯片组获取的频率。它未经校准,具有典型的电子公差。仅将其用于短时间间隔。

在处理时序时,延迟是最重要的因素。如果您不能足够快地读取它,那么您就没有用高度准确的定时源。当您在保护模式操作系统上以用户模式运行代码时,这始终是一个问题。它始终具有比您的代码运行优先级更高的代码。特别是设备驱动程序是麻烦制造者,尤其是视频和音频驱动程序。您的代码也可能会被换出 RAM,需要页面错误才能重新加载。在负载很重的机器上,无法在数百毫秒内运行您的代码并不罕见。您需要将这种故障模式考虑到您的设计中。如果您需要保证亚毫秒级精度,那么只有具有实时优先级的内核线程才能满足您的要求。

一个相当不错的计时器是您从 timeSetEvent() 获得的多媒体计时器。它旨在为需要可靠计时器的程序提供良好的服务。你可以让它在 1 毫秒内滴答作响,它会尽可能 catch 延迟。请注意,它是一个异步计时器,回调是在一个单独的工作线程上进行的,因此您必须小心处理适当的线程同步。

关于c++ - 计时器精度 : c clock( ) vs. WinAPI 的 QPC 或 timeGetTime( ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18346879/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com