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

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

Следующий фрагмент кода фиксирует синхронизацию кадров и метрики пользовательского раздела трассировки:

Котлин

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

Ява

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 .
{% дословно %} {% endverbatim %} {% дословно %} {% endverbatim %}