Сбор показателей макробенчмарка

Концепции и реализация Jetpack Compose

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

Приведенный ниже фрагмент кода позволяет получить метрики времени отрисовки кадра и пользовательских разделов трассировки:

Котлин

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 : время, необходимое для создания кадра на ЦП как в потоке пользовательского интерфейса, так и в RenderThread .

Данные измерения собраны в виде распределения по 50-му, 90-му, 95-му и 99-му процентилям.

Для получения дополнительной информации о том, как выявлять и улучшать медленную отрисовку кадров, см. раздел «Медленная отрисовка» .

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

TraceSectionMetric

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

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

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

TraceSectionMetric
Рисунок 4. Результаты TraceSectionMetric .
{% verbatim %} {% endverbatim %} {% verbatim %} {% endverbatim %}