Метрики — это основной тип информации, извлекаемой из ваших тестов. Они передаются в функцию 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.](https://developer.android.com/static/topic/performance/images/benchmark_images/macrobenchmark_results_frames_tracing.png?authuser=0000&hl=ru)
TraceSectionMetric
и FrameTimingMetric
.StartupTimingMetric
StartupTimingMetric
фиксирует показатели времени запуска приложения со следующими значениями:
-
timeToInitialDisplayMs
: количество времени с момента получения системой намерения запуска до момента визуализации первого кадра целевогоActivity
. -
timeToFullDisplayMs
: количество времени с момента получения системой намерения запуска до момента, когда приложение полностью отрисовывает отчет с помощью методаreportFullyDrawn()
. Измерение прекращается по завершении рендеринга первого кадра после вызоваreportFullyDrawn()
или содержащего его. Это измерение может быть недоступно в Android 10 (уровень API 29) и более ранних версиях.
StartupTimingMetric
выводит минимальное, медианное и максимальное значения из итераций запуска. Чтобы оценить улучшение запуска, вам следует сосредоточиться на медианных значениях, поскольку они дают наилучшую оценку типичного времени запуска. Дополнительные сведения о том, что влияет на время запуска приложения, см. в разделе Время запуска приложения .
![Результаты StartupTimingMetric](https://developer.android.com/static/topic/performance/images/benchmark_images/macrobenchmark_results_fully_drawn_startup.png?authuser=0000&hl=ru)
StartupTimingMetric
.КадрТаймингМетрика
FrameTimingMetric
собирает информацию о времени из кадров, созданных в ходе теста, например прокрутки или анимации, и выводит следующие значения:
-
frameOverrunMs
: время, в течение которого данный кадр не достигает крайнего срока. Положительные числа указывают на пропущенный кадр и видимые зависания или заикания. Отрицательные числа показывают, насколько кадр быстрее установленного срока. Примечание. Это доступно только на Android 12 (уровень API 31) и выше. -
frameDurationCpuMs
: количество времени, необходимое для создания кадра в ЦП как в потоке пользовательского интерфейса, так и вRenderThread
.
Эти измерения собираются в распределении по 50-му, 90-му, 95-му и 99-му процентилю.
Дополнительные сведения о том, как выявить и улучшить медленные кадры, см. в разделе Медленная отрисовка .
![Результаты FrameTimingMetric](https://developer.android.com/static/topic/performance/images/benchmark_images/macrobenchmark_results_frames.png?authuser=0000&hl=ru)
FrameTimingMetric
.TraceSectionMetric
TraceSectionMetric
фиксирует количество раз, когда встречается раздел трассировки, соответствующий указанному sectionName
, и количество времени, которое это занимает. Для времени он выводит минимальное, среднее и максимальное время в миллисекундах. Раздел трассировки определяется либо вызовом функцииtrace trace(sectionName)
либо кодом между Trace.beginSection(sectionName)
и Trace.endSection()
или их асинхронными вариантами. Он всегда выбирает первый экземпляр участка трассы, полученный во время измерения. По умолчанию он выводит только разделы трассировки из вашего пакета; чтобы включить процессы вне вашего пакета, установите targetPackageOnly = false
.
Дополнительные сведения о трассировке см. в разделах Обзор системной трассировки и Определение пользовательских событий .
![TraceSectionMetric](https://developer.android.com/static/topic/performance/images/benchmark_images/macrobenchmark_results_tracing.png?authuser=0000&hl=ru)
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](https://developer.android.com/static/topic/performance/images/benchmark_images/macrobenchmark_results_power.png?authuser=0000&hl=ru)
PowerMetric
.Рекомендуется для вас
- Примечание. Текст ссылки отображается, когда JavaScript отключен.
- Создание базовых профилей {:#creating-profile-rules}
- Написание макробенчмарка
- Анализ и оптимизация запуска приложения {:#app-startup-anaанализ-optimization}