QueryPerformanceCounter (), но в OSX

Этот вопрос был задан ранее (см. Что эквивалентно Windows QueryPerformanceCounter в OSX?), но, похоже, мои потребности немного отличаются от других вопросов, поэтому я собираюсь спросить еще раз.

Все, что я ищу, это счетчик тиков — мне не нужно UTC или что-то подобное. И мне нужен таймер, на который не влияет спящий режим — мне нужен счетчик тиков, который точно отражает количество пройденных тиков, даже когда машина находилась в спящем режиме.

QueryPerformanceCounter() на win32 есть ряд приятных свойств, которые соответствуют моим требованиям:

  • Высокое разрешение, вплоть до микросекунд
  • Продолжает считать, даже в системном спящем режиме (точнее, его количество включает время, прошедшее, когда система находилась в спящем режиме)
  • Монотонный — никогда не опускается. Не зависит от изменения системного времени.

На 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()

Я не думаю, что я полностью оценил, насколько здорово 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 не выжили в спящем режиме.

1

Решение

Задача ещё не решена.

Другие решения


По вопросам рекламы [email protected]