Intereting Posts
Обновите несколько параметров POST Формат видеозаписи (.3gp или mp4) в андроиде? Visual Studio Emulator для Android – проект не развертывается Невозможно применить системную яркость экрана программно в Android Свертывание панели инструментов и фрагмента Получить уникальный идентификатор устройства Android? Приложение может слишком много работать над своей основной нитью Spacing Issue при создании макета шины в режиме ресайклера Gridlayout manager Как открыть URL-адрес в браузере Android из моего приложения? Как реализовать обрезку видео на Android, например instagram или Whatsapp? Android – переключение между передней и задней камерами во время записи видео Как напрямую читать / записывать файлы с устройства и на устройство (например, эффект O_DIRECT-флага) на Java-пути? Android AlertDialog исключение "Ресурсы $ NotFoundException" Виджет кнопки входа в Facebook отсутствует идентификатор ресурса Сбросить значения по умолчанию для предпочтений

Как получить таймер с высоким разрешением в собственном коде Android?

Я ищу способ получить таймер с высоким разрешением (источник синхронизации) на Android. Это должно быть в собственном коде и может быть довольно не переносимым. Я хотел бы получить разрешение на микросекунду, или лучше. Для моего конкретного приложения разрешение более важно, чем точность, и лучше всего использовать монотонный таймер. Я тестировал на определенном чипсете ARMv7 с Android 4.0.3.

То, что я пробовал до сих пор:

  • clock_gettime(CLOCK_MONOTONIC) : увеличивается в единицах 1 мс на целевом оборудовании ( EDIT изначально я думал, что 10 мс из-за ошибки в моем коде, 1 мс правильно, но все же не очень хорошо)
  • gettimeofday() : похоже на clock_gettime

То, что я не пробовал:

  • System.nanoTime() : это не является родным. Я полагаю, что он основан на clock_gettime (), но я бы предпочел выяснить, что находится под капотом, и использовать это напрямую.
  • /dev/rtc
  • Какая-то инструкция / средство ARM, возможно, SysTick ( http://web.eecs.umich.edu/~prabal/teaching/eecs373-f10/readings/ARMv7-M_ARM.pdf ) или таймер общего назначения (GPT).

См. Также (связанные вопросы, но нет ответа):

  • Высокоточный таймер в Android JNI

  • Получение высокоточного времени на Android

Solutions Collecting From Web of "Как получить таймер с высоким разрешением в собственном коде Android?"

Вы можете использовать счетчик циклов процессора, чтобы измерить количество циклов между двумя моментами, а затем преобразовать их в секунды. Чтобы гарантировать, что процессор работает на своей номинальной частоте, переключите его регулятор масштабирования в режим «производительности» (для этого есть множество приложений в Play Store, но ему необходим root-доступ). Вы также должны будете хорошо охладить устройство, чтобы убедиться, что CPU не дросселирует (это особенно важно для телефонов). Наконец, вы должны привязать свой код к одному ядру (желательно ядро ​​0, потому что другие ядра могут быть отключены системой в автономном режиме).

Существует два способа доступа к счетчику циклов в ARM: использование подсистемы perf_event в Linux или прямое считывание счетчика циклов из сопроцессора CP15. Метод perf_event будет работать только в том случае, если ядро ​​Linux скомпилировано с поддержкой этой подсистемы (файл / proc / sys / kernel / perf_event_paranoid существует) и чтение счетчиков событий не ограничено (файл / proc / sys / kernel / perf_event_paranoid содержит 0 или – 1, с доступом root вы можете перезаписать значение в этом файле). Метод CP15 будет работать только в том случае, если включен режим доступа пользователей к счетчикам производительности (по умолчанию он всегда отключен, и вам придется либо исправлять ядро, либо использовать драйвер ядра для его включения). Yeppp! Библиотека (я автор) способна использовать любой метод всякий раз, когда она доступна, и включает драйвер режима ядра, чтобы включить доступ к пользовательским режимам для счетчиков производительности. Вы можете найти этот пример полезным.

  1. Android не поддерживает ARMv7-M, поэтому Systick выходит за рамки уравнения.
  2. Я не очень опытен с таймерами в android / linux. Если вы собираетесь запускать это программное обеспечение на своем собственном устройстве, вы можете включить PMU в Linux и использовать регистр циклов CPU для точности, приближающейся к наносекундам. Это не рекомендуется, если вы собираетесь опубликовать свое программное обеспечение или предложить его конечному потребителю, поскольку у Производителей есть другая конфигурация ядра на разных устройствах, и, следовательно, PMU может не быть включен / недоступен.

EDIT: вы также можете просмотреть https://groups.google.com/forum/?fromgroups=#!topic/android-ndk/dgrqhgHWbHI и clock_getres (), чтобы проверить разрешение clock_gettime ()