Для тех, кто приезжает сюда в поисках реализации getTickCount () для iOS, вот мой пример после объединения различных источников.
Ранее у меня была ошибка в этом коде (сначала я разделил на 1000000), которая приводила к некоторому количественному определению выходных данных на моем iPhone 6 (возможно, это не было проблемой на iPhone 4 / etc или я просто не заметил этого). Обратите внимание, что если сначала не выполнить это деление, существует некоторый риск переполнения, если числитель временной базы достаточно велик. Если кому-то интересно, здесь есть ссылка с гораздо более подробной информацией: https://stackoverflow.com/a/23378064/588476
В свете этой информации, возможно, безопаснее использовать функцию Apple CACurrentMediaTime
!
Я также протестировал вызов mach_timebase_info
, и на моем iPhone 6 он потребовал приблизительно 19 нс, поэтому я удалил (не поддерживающий потоки) код, который кэшировал выходные данные этого вызова.
#include <mach/mach.h>
#include <mach/mach_time.h>
uint64_t getTickCount(void)
{
mach_timebase_info_data_t sTimebaseInfo;
uint64_t machTime = mach_absolute_time();
// Convert to milliseconds
mach_timebase_info(&sTimebaseInfo);
machTime *= sTimebaseInfo.numer;
machTime /= sTimebaseInfo.denom;
machTime /= 1000000; // convert from nanoseconds to milliseconds
return machTime;
}
Имейте в виду потенциальный риск переполнения в зависимости от выходных данных вызова временной базы. Я подозреваю (но не знаю), что она может быть постоянной для каждой модели iPhone. на моем айфоне 6 это было 125/3
.
Решение с использованием CACurrentMediaTime()
довольно тривиально:
uint64_t getTickCount(void)
{
double ret = CACurrentMediaTime();
return ret * 1000;
}