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

Метрики — это основной тип информации, извлекаемой из ваших тестов. Они передаются в функцию 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 подробно описаны далее в этом документе.

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

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

StartupTimingMetric

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

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

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

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

КадрТаймингМетрика

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