Использование Simpleperf для профилирования ГП
Simpleperf собирает данные приложения с заданной частотой, чтобы определить, где ЦП расходует время, а также где происходят другие события, связанные с производительностью оборудования. Для получения трассировки Simpleperf не требуется вносить изменения в код, что делает его отличным инструментом для быстрого и широкого анализа производительности приложения. Рекомендуется использовать Simpleperf для отладки проблем с производительностью в вашем приложении.
Приложения, профилируемые с помощью Simpleperf, должны быть сборками для разработки. Simpleperf установлен в каталоге /bin/ на устройствах Meta Quest, но Android NDK предоставляет скрипты для запуска Simpleperf с хост-машины. Для использования этих скриптов необходимо установить Android NDK.
В Android Studio при разработке рекомендуется включать оптимизации и символы. Хотя это и не относится к обязательным требованиям, профилирование с включенной оптимизацией позволяет получить более точное представление о том, как будет функционировать ваше приложение после его выпуска для пользователей.
Следующие рабочие процессы показывают, как использовать Simpleperf для захвата и анализа трассировки производительности.
Захват трассировки с помощью Simpleperf
После установки приложения на устройство и его запуска используйте скрипт app_profiler.py для начала записи трассировки следующим образом:
python <ndk path>/simpleperf/app_profiler.py --disable_adb_root --ndk_path <ndk path> --app <package name> -r "-g --duration <seconds> -e cpu-cycles,cache-misses"
--disable_adb_root требуется, чтобы предотвратить попытки app_profiler.py получить root-доступ, а -r позволяет указать аргументы, которые будут переданы Simpleperf на устройстве.
Чтобы получить полный список дополнительных аргументов, которые можно передать через -r, выполните Simpleperf через adb shell следующим образом:
adb shell bin/simpleperf record --help
Выше используются следующие аргументы:
-g — указывает Simpleperf записывать графы вызовов, основанные на DWARF, которые обеспечивают лучшую поддержку по сравнению с графами вызовов, основанными на стековых кадрах, на ARM-устройствах.--duration — позволяет задать продолжительность трассировки в секундах. Это необязательно.-e — позволяет указать, какие события ЦП вы хотите записывать. В этом примере записываются cpu-cycles и cache-misses:
cpu-cycles — это событие полезно для определения функций, в которых приложение проводит больше всего времени во время трассировки. В отчете показывается, сколько времени процессора тратится в процентах по сравнению с другими функциями в приложении. Если -e не указан, это событие включено по умолчанию.cache-misses — это событие полезно для выявления пропусков кэша данных в приложении. Как и в случае с cpu-cycles, в отчете указывается, какие функции приложения имеют наибольшее количество пропусков кэша в процентах. По умолчанию это событие отключено, но его включение помогает обнаружить неэффективные паттерны доступа к памяти в приложении.- Доступны дополнительные события, которые можно записывать с помощью Simpleperf. Выполните команду
adb shell bin/simpleperf list, чтобы получить полный список событий, которые можно передать с помощью -e.
После захвата трассировки с помощью app_profiler.py просмотрите данные трассировки с помощью скрипта report_html.py:
python <ndk path>/simpleperf/report_html.py
Отчет откроется как веб-страница в браузере по умолчанию.
Скрипт report_html.py создает страницу с 3 вкладками. Каждая вкладка позволяет переключаться между различными событиями ЦП, указанными с помощью аргумента -e.
Статистика в виде диаграммы
Вкладка Chart Statistics (Статистика в виде диаграммы) отображает круговую диаграмму с выборками, записанными из каждого процесса. Нажимайте сегменты диаграммы, чтобы изучить потоки, библиотеки и вызовы функций.
Вкладка Sample Table (Таблица выборки) показывает сортируемую и фильтруемую таблицу всех функций, которые были зафиксированы в трассировке. Нажатие на строку в таблице отображает график вызовов с выборками для этой функции.
Вкладка Flamegraph (Flame-график) отображает графики вызовов для каждого потока вашего приложения. Нажмите любую секцию функции в графике, чтобы увеличить масштаб для этой функции.