Сбор показателей Macrobenchmark

Основные понятия и реализация Jetpack Compose

Показатели – это основной тип информации, извлекаемой из контрольных показателей. Они передаются функции measureRepeated в виде объекта List, что позволяет указать сразу несколько показателей. Для сравнения необходим хотя бы один тип показателей.

В следующем фрагменте кода показано, как получить показатели времени формирования кадра и пользовательского раздела трассировки:

Kotlin

benchmarkRule.measureRepeated(
    packageName = TARGET_PACKAGE,
    metrics = listOf(
        FrameTimingMetric(),
        TraceSectionMetric("RV CreateView"),
        TraceSectionMetric("RV OnBindView"),
    ),
    iterations = 5,
    // ...
)

Java

benchmarkRule.measureRepeated(
    TARGET_PACKAGE,     // packageName
    Arrays.asList(      // metrics
        new StartupTimingMetric(),
        new TraceSectionMetric("RV CreateView"),
        new TraceSectionMetric("RV OnBindView"),
    ),
    5,                  // Iterations
    // ...
);

В этом примере RV CreateView и RV OnBindView – идентификаторы отслеживаемых блоков, определенных в файле RecyclerView. Исходный код метода createViewHolder() – это пример того, как можно определить отслеживаемые блоки в собственном коде.

StartupTimingMetric, TraceSectionMetric и FrameTimingMetric подробно описаны ниже. Полный список показателей приведен в подклассах Metric.

Результаты тестирования выводятся в Android Studio, как показано на рисунке 1. Если задано несколько показателей, все они будут объединены в выходных данных.

Результаты TraceSectionMetric и FrameTimingMetric.
Рисунок 1. Результаты TraceSectionMetric и FrameTimingMetric.

StartupTimingMetric

StartupTimingMetric регистрирует показатели времени запуска приложения со следующими значениями:

  • timeToInitialDisplayMs – время с момента, когда система получает намерение запуска, до момента, когда она отрисовывает первый кадр целевого объекта Activity.
  • timeToFullDisplayMs – время с момента, когда система получает намерение запуска, до момента, когда приложение сообщает о полной отрисовке с помощью метода reportFullyDrawn(). Измерение прекращается после завершения отрисовки первого кадра, который содержит вызов reportFullyDrawn() или следует за ним. Этот показатель может быть недоступен на устройствах с Android 10 (уровень API 29) и более ранними версиями.

StartupTimingMetric выводит минимальное, медианное и максимальное значения из итераций запуска. Чтобы оценить улучшение запуска, всегда ориентируйтесь на медианные значения, поскольку они дают наилучшую оценку типичного времени запуска у пользователей. Подробнее о том, что влияет на время запуска приложения…

Результаты StartupTimingMetric
Рисунок 2. StartupTimingMetric результатов.

FrameTimingMetric

FrameTimingMetric собирает информацию о времени из кадров, созданных тестом производительности, например прокрутки или анимации, и выводит следующие значения:

  • frameOverrunMs: время, на которое кадр задерживается. Положительные числа указывают на пропущенный кадр, сопровождаемый видимым заиканием или заиканием. Отрицательные числа показывают, насколько быстрее был сформирован кадр по сравнению с аппаратным ограничением подсистемы. Примечание. Этот показатель доступен только в Android 12 (уровень API 31) и более поздних версиях.
  • frameDurationCpuMs – время, за которое ЦП создает кадр в потоке UI и RenderThread.

Эти измерения собираются в распределении 50-го, 90-го, 95-го и 99-го процентилей.

Подробнее о том, как выявлять и устранять проблемы с медленной отрисовкой…

Результаты FrameTimingMetric
Рисунок 3. FrameTimingMetric результатов.

TraceSectionMetric

TraceSectionMetric фиксирует, сколько раз выполняется определенный раздел трассировки и сколько времени на это уходит. Для отслеживания времени он выводит минимальное, среднее и максимальное время в миллисекундах.

Целевой раздел трассировки определяется либо вызовом функции trace(sectionName), либо границами блока более низкого уровня между Trace.beginSection(sectionName) и Trace.endSection() или их асинхронными вариантами. Всегда выбирается первый экземпляр раздела трассировки, зафиксированный во время измерения. По умолчанию выводятся только разделы трассировки из вашего пакета. Чтобы включить процессы за пределами пакета, задайте targetPackageOnly = false.

Дополнительную информацию о трассировке можно найти в статьях Обзор трассировки системы и Определение специальных событий.

TraceSectionMetric
Рисунок 4. TraceSectionMetric результатов.