[英]Why GetTickCount and timeGetTime have different resolution?
默认情况下,GetTickCount和timeGetTime具有相同的分辨率-15.625ms,但是在我调用timeBeginPeriod(1)之后,GetTickCount仍然每15.625 ms更新一次,而timeGetTime却每1ms更新一次,为什么呢?
在等待计时器中的错误? ,作者提到:
我想知道:为什么GetTickCount和timeGetTime来自相同的RTC,但是有两种分辨率?
谢谢!
实际上,您引用的表对于QueryPerformanceCounter是错误的。 QPC(简称QPC)是根据3种可能的时序源实现的,它们是1:HPET,2:PM ACPI定时器,3:RDTSC。 启发式决定取决于条件,内核引导选项,BIOS中的错误以及芯片组提供的ACPI代码中的错误。 所有这些错误都是在Microsoft实验室中基于每个硬件发现的。 Linux和BSD程序员必须自己找到困难的地方,通常必须重写ACPI代码以解决问题。 出于各种原因,Linux社区已经讨厌RDTSC以及ACPI。 但无论如何...
timeReadTime与GetTickCount不同,因为出于稳定性的考虑,根据指定文档的方式,GetTickCount使其行为无法更改。 但是,在某些情况下,为了获得更好的计时器功能,Windows需要获得更好的Tick分辨率。 (计时器将消息与发送到应用程序GetMessage或PeekMessage函数的消息一起使用,然后分支到良好的回调中以处理计时器)对于诸如声音/音频同步之类的多媒体来说,这是必需的。
显然,游戏或实时编程甚至在某些时候都需要更高的精度,并且不能使用计时器。 取而代之的是,他们使用繁忙的等待,或者只在一种情况下入睡:通过调用OpenGL或DirectX uppon后缓冲区/前缓冲区交换来实现VSync。 视频驱动程序将从屏幕本身唤醒等待线程upSync VSync信号。 这是基于事件的睡眠,例如计时器,但不基于计时器中断。
应该注意的是,现代内核具有动态滴答(tickless内核,来自Windows 8或Linux 2.6.18)。 滴答声中断的最佳频率不能低于1ms,以免发生窒息,但没有上限。 如果没有应用程序在运行并且没有发布计时事件,则机器可能会无限期地进入睡眠状态,从而使CPU进入最深的睡眠状态(英特尔增强速度步骤C7状态)。 之后,大多数情况下,下一次唤醒事件是由于设备中断(主要是USB)而发生的。 (鼠标移动或其他东西)
我认为OP在计时器,中断和计时器滴答之间变得混乱。
量子间隔是计时器的滴答周期。 它以18.2节/秒的速度硬连线到系统中。 这永远不会因任何原因而变化,并且也不基于系统CPU时钟(很明显!)。
您可以要求系统提供2种不同的信息:日期和时间(GetTime)或系统运行的时间量(GetTickCount / GetTickCount64)。
如果您对系统的正常运行时间感兴趣,请使用GetTickCount。 据我有限的理解,GetInterruptTime仅返回实时中断所花费的时间(与运行应用程序或空闲状态所花费的时间相对)。
我不确定是否要告诉新程序员停止询问“为什么?” 将帮助他们。 是的,OP没有看到或阅读所提及页面上的评论; 但在这里询问不应仅授予已经用尽所有其他途径(可能包括C的Seeing Stones)的搜索者。 我们都在这里学习。 不要告诉别人他们的问题毫无意义,而不必告诉他们为什么。 而且没有理由不问。 计时器可能会令人困惑!
对于那些对为什么系统滴答曾经以18.2Hz运行的人感到好奇的是以下解释:1981年发布的原始IBM PC的时钟速度为4.77MHz,并使用了Intel 8253可编程间隔计时器。 计时器的预分频器为4,系统计时器的编程值为0,因此计数间隔为65536。因此,系统计时器频率=(4770000/4)/ 65536 = 18.2Hz即使所有现代PC仍使用此配置尽管时钟现在更高了,而8253现在已经过时了(但仍在芯片组中实现)。
但是,现代操作系统(例如Windows 10和Linux)对此计时器进行编程,以生成1000Hz的系统时钟,而不是以前的18.2Hz。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.