Профилирование с Hermes¶
Вы можете визуализировать производительность JavaScript в приложении React Native с помощью Hermes. Hermes — это небольшой и легкий движок JavaScript, оптимизированный для запуска React Native на Android (подробнее об использовании его с React Native можно прочитать здесь. Hermes помогает повысить производительность приложений, а также предоставляет способы анализа производительности выполняемого JavaScript.
В этом разделе вы узнаете, как составить профиль вашего приложения React Native, работающего на Hermes, и как визуализировать профиль с помощью вкладки Performance в Chrome DevTools
Перед началом работы обязательно включите Hermes в вашем приложении!
Следуйте приведенным ниже инструкциям, чтобы начать профилирование:
- Запишите профиль выборки Hermes
- Выполнить команду из CLI
- Открыть загруженный профиль в Chrome DevTools
Запись профиля выборки Hermes¶
Чтобы записать профиль выборки из меню Dev, выполните следующие действия:
- Перейдите в терминал запущенного Metro-сервера.
- Нажмите
d
, чтобы открыть Dev Menu.. - Выберите Enable Sampling Profiler..
- Выполните JavaScript в вашем приложении (нажмите кнопки и т.д.).
- Откройте Dev Menu, нажав
d
еще раз. - Выберите Disable Sampling Profiler, чтобы остановить запись и сохранить профилировщик выборки.
В тосте будет показано место сохранения профилировщика выборки, обычно в /data/user/0/com.appName/cache/*.cpuprofile
.
Выполнить команду из CLI¶
Вы можете использовать React Native CLI для преобразования профиля трассировки Hermes в профиль трассировки Chrome, а затем извлечь его на локальную машину с помощью:
1 |
|
Включение карты источников¶
Вы можете прочитать о картах исходников на странице source maps.
Общие ошибки¶
adb: no devices/emulators found
или adb: device offline
.¶
- Почему это происходит CLI не может получить доступ к устройству или эмулятору (через adb), который вы используете для запуска приложения.
- Как исправить Убедитесь, что ваше устройство/эмулятор Android подключено и работает. Команда работает только тогда, когда она может получить доступ к adb.
Нет файла в каталоге cache/
.¶
- Почему это происходит CLI не может найти файл .cpupuprofile в каталоге cache/ вашего приложения. Возможно, вы забыли записать профиль с устройства.
- Как исправить Следуйте инструкциям для включения/выключения профилировщика с устройства.
Ошибка: your_profile_name.cpupuprofile is an empty file
.¶
- Почему это происходит Профиль пуст, это может быть связано с неправильной работой Hermes.
- Как исправить Убедитесь, что ваше приложение работает на последней версии Hermes.
Откройте загруженный профиль в Chrome DevTools¶
Чтобы открыть профиль в Chrome DevTools, выполните следующие действия:
- Откройте Chrome DevTools.
- Выберите вкладку Performance.
- Щелкните правой кнопкой мыши и выберите Загрузить профиль....
Как работает трансформатор профиля Hermes?¶
Профиль Hermes Sample Profile имеет формат JSON object format
, в то время как формат, поддерживаемый Google's DevTools, — JSON Array Format
. (Более подробную информацию о форматах можно найти в Trace Event Format Document).
1 2 3 4 5 |
|
Профиль Hermes имеет большую часть информации, закодированной в свойствах samples
и stackFrames
. Каждый образец — это снимок стека вызовов функций в данный момент времени, поскольку каждый образец имеет свойство sf
, которое соответствует вызову функции.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
Информация о вызове функции может быть найдена в stackFrames
, который содержит пары ключ-объект, где ключом является номер f
, а соответствующий объект дает нам всю необходимую информацию о функции, включая номер f
ее родительской функции. Эта связь между родителями и детьми может быть прослежена вверх, чтобы найти информацию обо всех функциях, запущенных в определенный момент времени.
1 2 3 4 5 6 7 8 9 10 11 12 |
|
На этом этапе вам следует определить еще несколько терминов, а именно:
- Узлы: Объекты, соответствующие номерам
sf
вstackFrames
. - Активные узлы: Узлы, которые в данный момент выполняются в определенный момент времени. Узел классифицируется как работающий, если его номер
sf
находится в стеке вызовов функции. Этот стек вызовов может быть получен из номераsf
образца и прослежен вверх, пока не будут доступны родительскиеsf
.
Затем samples
и stackFrames
в тандеме могут быть использованы для генерации всех событий начала и окончания в соответствующие временные метки, при этом:
- Начальные узлы/события: Узлы, отсутствующие в стеке вызовов функций предыдущего образца, но присутствующие в стеке текущего образца.
- Конечные узлы/события: Узлы, присутствующие в стеке вызовов функций предыдущего образца, но отсутствующие в текущем образце.
Теперь вы можете построить пламенную диаграмму
вызовов функций, поскольку у вас есть вся информация о функции, включая временные метки ее начала и окончания.
Трансформатор hermes-profile-transformer
может преобразовать любой профиль, созданный с помощью Hermes, в формат, который можно напрямую отобразить в Chrome DevTools. Более подробную информацию об этом можно найти на @react-native-community/hermes-profile-transformer
.