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

Метрики — это основной тип информации, извлекаемой из ваших бенчмарков. Они передаются в функцию 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 и PowerMetric подробно описаны далее в этом документе. Полный список метрик см. в подклассах класса 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 фиксирует количество повторений трассировочного участка, соответствующего указанному sectionName , и время его выполнения. Для времени выводятся минимальное, медианное и максимальное значения в миллисекундах. Трассировочный участок определяется либо вызовом функции trace(sectionName) , либо кодом между Trace.beginSection(sectionName) и Trace.endSection() или их асинхронными вариантами. Всегда выбирается первый экземпляр трассировочного участка, зафиксированный во время измерения. По умолчанию выводятся только трассировочные участки из вашего пакета; чтобы включить процессы вне вашего пакета, установите targetPackageOnly = false .

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

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

PowerMetric

PowerMetric фиксирует изменение мощности или энергии на протяжении всего теста для указанных категорий мощности . Каждая выбранная категория разбивается на измеримые подкомпоненты, а невыбранные категории добавляются к показателю «невыбранные».

Эти показатели измеряют потребление ресурсов в масштабах всей системы, а не потребление ресурсов отдельными приложениями, и применимы только к устройствам Pixel 6, Pixel 6 Pro и более поздним моделям:

  • power<category>Uw : количество энергии, потребляемой за время вашего теста в этой категории.
  • energy<category>Uws : количество энергии, передаваемой за единицу времени на протяжении всего теста в этой категории.

В число категорий входят следующие:

  • CPU
  • DISPLAY
  • GPU
  • GPS
  • MEMORY
  • MACHINE_LEARNING
  • NETWORK
  • UNCATEGORIZED

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

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