TickCount() устарела в Mac OS X 10.8

Я использую TickCount() для определения разницы во времени между событиями или времени, необходимого для запуска определенного фрагмента кода. Но это устарело в OS X 10.8. Поэтому мне нужна была альтернатива для того же.


person dDarkLORD    schedule 22.11.2012    source источник
comment
Пожалуйста, нажмите на устаревшую ссылку в исходном сообщении и найдите документацию по TickCount.   -  person dDarkLORD    schedule 22.11.2012
comment
Хорошо понял. Я даже никогда не слышал об этом.   -  person trojanfoe    schedule 22.11.2012


Ответы (2)


  1. Если вы хотите измерить абсолютное время, используйте gettimeofday(). Это дает вам дату, например, «Четверг, 22 ноября, 07:48:52 UTC 2012». Это не всегда подходит для измерения различий между событиями, поскольку время, сообщаемое gettimeofday(), может переходить вперед или назад, если пользователь меняет часы.

  2. Если вы хотите измерить относительное время, mach_absolute_time(). Это позволяет измерить разницу между двумя событиями, например, «15,410 с». Это не дает абсолютного времени, но всегда монотонно.

  3. Если вы хотите измерить процессорное время, используйте clock(). Это часто, но не всегда способ измерения производительности фрагмента кода. Он не учитывает время, затрачиваемое на ввод-вывод, или влияние на скорость системы, поэтому его следует использовать только тогда, когда вы знаете, что измеряете что-то, связанное с процессором.

Я удивлен, что TickCount() не устарел раньше. Это действительно OS 9 и более ранние версии.

person Dietrich Epp    schedule 22.11.2012
comment
Я верю, что mach_absolute_time() послужит моей цели. Большое спасибо. - person dDarkLORD; 22.11.2012
comment
Однако @dDarkLORD gettimeofday() более портативный. - person trojanfoe; 22.11.2012
comment
@trojanfoe: нет смысла использовать переносную функцию, если она не делает то, что вы хотите. В Linux вы бы использовали clock_gettime(), в OS X вы бы использовали mach_absolute_time(), ни один из которых не доступен в другой операционной системе. - person Dietrich Epp; 22.11.2012

Хотя этот API может не подходить для новой разработки, если вам нужен идентичный API, его можно повторно реализовать следующим образом:

uint32_t TickCount() {
    uint64_t mat = mach_absolute_time();
    uint32_t mul = 0x80d9594e;
    return ((((0xffffffff & mat) * mul) >> 32) + (mat >> 32) * mul) >> 23;
}

Вышеупомянутая реализация была создана путем анализа /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/CarbonCore.framework/Versions/A/CarbonCore и была кратко протестирована на соответствие устаревшему TickCount с помощью LLDB путем изменения регистров, возвращаемых mach_absolute_time.

person Alexander O'Mara    schedule 12.03.2016