QueryPerformanceCounter(),但在OSX上

时间:2014-07-30 00:52:45

标签: c++ c time timer performancecounter

之前已经问过这个问题(见What's the equivalent of Windows' QueryPerformanceCounter on OSX?),但似乎我的需求与其他问题有点不同,所以我会再次提问。

我所寻找的只是一个滴答计数器 - 我不需要UTC或类似的东西。我需要一个不受睡眠模式影响的计时器 - 我需要一个能够准确反映已经过多少滴答的计时器计数器,即使机器处于睡眠模式也是如此。

win32上的

QueryPerformanceCounter()有许多符合我要求的不错的属性:

  • 高分辨率,低至微秒
  • 继续计数,即使在系统睡眠中(或者它的计数包括系统处于睡眠模式时所经过的时间)
  • 单调 - 永不落下。不受更改系统时间的影响。

在OSX上,据我所知,我有以下备选方案,但它们都不是很好:

  1. gettimeofday()
    • 分辨率低至毫秒(好的,不是很好)
    • 继续计算系统睡眠(好)
    • 受更改系统时钟(坏)的影响
  2. mach_absolute_time()
    • 分辨率低至微秒(好)
    • 在系统睡眠中没有计数(坏)
    • 不受更改系统时钟的影响(好)
  3. host_get_clock_service( SYSTEM_CLOCK )& clock_get_time()(见mach / clock.h)
    • 似乎与mach_absolute_time()
    • 相同
  4. host_get_clock_service( CALENDAR_CLOCK )& clock_get_time()(见mach / clock.h)
    • 似乎与gettimeofday()
    • 相同
  5. 在我开始研究这个问题之前,我并不认为我完全理解QueryPerformanceCounter()是多么伟大。它是如何工作的?它是否使用HPET?系统进入睡眠状态时HPET是否会进入睡眠状态?如果没有,为什么OSX不以这种方式暴露HPET?如果是这样,Windows如何弥补这一点?

    更新1:

    有关QueryPerformanceCounter如何在这里工作的有趣讨论:http://msdn.microsoft.com/en-us/library/windows/desktop/dn553408(v=vs.85).aspx

    显然它曾在Win XP时代使用过CPU TSC,切换到使用Vista中的HPET / ACPI计时器,并再次切换到Win 7中改进的TSC,但又回到了HPET / ACPI。尽管如此,我总是认为HPET和TSC并没有在睡眠模式下存活下来。

0 个答案:

没有答案