SystraceProfiler
– это инструмент профилирования, который позволяет измерять время выполнения конкретных участков кода, называемых «секциями». Путем измерения времени выполнения каждой секции вы можете выявить факторы, которые вызывают задержки в работе вашего приложения.
Использование секционного профайлера особенно полезно в крупных приложениях с распределенной системой из множества компонентов и сервисов. Профайлер позволяет быстрее идентифицировать проблемные участки кода и сосредоточиться на их улучшении для повышения общей производительности приложения. Применять его можно и при внесении изменений в проект, чтобы оценить, какое влияние оказали эти изменения.
SystraceProfiler
инициализируется при запуске приложения, но для начала профилирования требуется явная разметка начала и конца секции анализа – время выполнения будет считаться между этими точками. Такой подход позволяет оценить скорость выполнения вплоть до конкретных методов и запросов.
Собранные данные профилирования находятся в разделе «Секционный профайлер». Здесь отображены данные о версии приложения, устройстве, ОС, теге, с которым было выполнено профилирование, и длительности его выполнения:
Количество отчётов ограничено – не более 500 штук в день. Все они автоматически сгруппированы по версии приложения и тэгу. Просмотреть результаты профилирования можно прямо в браузере по клику на интересующий отчет. Для каждого метода высчитано время выполнения, количество вхождений конкретного метода в секцию профилирования и прочие метрики:
Таким образом, секционный профайлер – мощный инструмент для анализа производительности кода, который помогает выявлять узкие места и проблемные участки, требующие оптимизации. В результате это ведет к повышению не только эффективности работы приложения, но и общего качества пользовательского опыта.
Перед началом использования плагина в вашем проекте, необходимо подключить зависимости:
В вашем <project>/<app-module>/build.gradle.kts
dependencies { implementation(platform("ru.ok.tracer:tracer-platform:0.5.1")) implementation("ru.ok.tracer:tracer-profiler-systrace") }
Более подробное описание зависимостей ищите на странице Быстрый старт.
После подключения необходимых зависимостей нужно установить плагин в конфигурацию Tracer:
В вашем Application.kt
class MyApplication : Application(), HasTracerConfiguration { override val tracerConfiguration: List<TracerConfiguration> get() = listOf( SystraceProfilerConfiguration.build { // ваши опции }, ) }
Настраивать работу плагина позволяет SystraceProfilerConfiguration.Builder
, в котором есть следующие опции:
Опции SystraceProfilerConfiguration.Builder
:
Опция | Описание |
---|---|
setEnabled | Отвечает за включение/выключение профилирования. По умолчанию включён |
Запуск профайлера обозначается вызовом SystraceProfiler.start()
, который принимает следующие параметры:
Параметр | Описание |
---|---|
context: Context | App context приложения. |
tag: String | Тег, с которым результат будет загружен в Трейсер. |
duration: Long | Время работы профайлера в ms. |
Обозначить конец секции профилирования можно одним из следующих способов:
Опция | Описание |
---|---|
SystraceProfiler.abort() | Прекращает работу профайлера и очищает результат. |
SystraceProfiler.commit() | Прекращает работу профайлера и отправляет результат. |
tagSuffix: String | Опционально. Суффикс, который будет добавлен к тегу. |
Раннее мы уже упомянули, что для выполнения профилирования конкретного участка кода требуется явная разметка начала и конца интересующей секции. Класс android.os.Trace
предоставляет простые методы для добавления меток в код вашего приложения:
Метод | Описание |
---|---|
Trace.beginSection(String sectionName) | Начинает секцию, которая будет представлять определенный участок кода. sectionName – название секции. |
Trace.endSection() | Метод закрывает секцию. |
Мы рекомендуем оборачивать содержимое секции профилирования в try/finally
– это важно для корректного закрытия секции в случае, если в процессе работы исследуемый метод выбросит исключение:
fun exampleMethod() { // запуск профайлера SystraceProfiler.start(context, "tag", 3000) // начало секции Trace.beginSection("exampleSection") try { // выполнение операций внутри секции // ... } finally { // закрытие секции Trace.endSection() } // завершение профилирования SystraceProfiler.commit("suffix")
По завершению профилирования в отчёте о результатах размеченный участок будет явно выделен: