Этот вопрос был задан ранее (см. Что эквивалентно Windows QueryPerformanceCounter в OSX?), но, похоже, мои потребности немного отличаются от других вопросов, поэтому я собираюсь спросить еще раз.
Все, что я ищу, это счетчик тиков — мне не нужно UTC или что-то подобное. И мне нужен таймер, на который не влияет спящий режим — мне нужен счетчик тиков, который точно отражает количество пройденных тиков, даже когда машина находилась в спящем режиме.
QueryPerformanceCounter()
на win32 есть ряд приятных свойств, которые соответствуют моим требованиям:
На 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
Очевидно, когда-то он использовал TSC процессора в дни Win XP, переключился на использование таймеров HPET / ACPI в Vista и снова переключился на улучшенные TSC в Win 7, но вернулся к HPET / ACPI. Тем не менее, у меня всегда было впечатление, что HPET и TSC не выжили в спящем режиме.
Задача ещё не решена.