之前已经问过这个问题(见What's the equivalent of Windows' QueryPerformanceCounter on OSX?),但似乎我的需求与其他问题有点不同,所以我会再次提问。
我所寻找的只是一个滴答计数器 - 我不需要UTC或类似的东西。我需要一个不受睡眠模式影响的计时器 - 我需要一个能够准确反映已经过多少滴答的计时器计数器,即使机器处于睡眠模式也是如此。
win32上的 QueryPerformanceCounter()
有许多符合我要求的不错的属性:
在OSX上,据我所知,我有以下备选方案,但它们都不是很好:
gettimeofday()
mach_absolute_time()
host_get_clock_service( SYSTEM_CLOCK )
& clock_get_time()
(见mach / clock.h)
mach_absolute_time()
host_get_clock_service( CALENDAR_CLOCK )
& clock_get_time()
(见mach / clock.h)
gettimeofday()
在我开始研究这个问题之前,我并不认为我完全理解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并没有在睡眠模式下存活下来。