Как профилировать микротест

По умолчанию Microbenchmarks предоставляет вам информацию о времени и распределении выполненного кода. Если вы хотите узнать, почему код выполняется медленно, изучите трассировку метода, которая по умолчанию записывается в поддерживаемых версиях ОС, или выберите другие конфигурации профилирования.

Чтобы выбрать конфигурацию профилировщика, добавьте аргумент средства запуска инструментирования androidx.benchmark.profiling.mode с одним из аргументов: MethodTracing (по умолчанию), StackSampling или None, как показано во фрагменте кода ниже.

Подробнее о записи методов Java/Kotlin… MethodTracing эквивалентно трассировке, а StackSampling – выборке, как определено в этом документе.

Яркий

android {
    defaultConfig {
        // must be one of: 'None', 'StackSampling', or 'MethodTracing'
        testInstrumentationRunnerArguments["androidx.benchmark.profiling.mode"]= 'StackSampling'
    }
}

Kotlin

android {
    defaultConfig {
        // must be one of: 'None', 'StackSampling', or 'MethodTracing'
        testInstrumentationRunnerArguments["androidx.benchmark.profiling.mode"] = "StackSampling"
    }
}

При профилировании теста выходной файл .trace копируется на хост в каталог вместе с результатами JSON. Чтобы посмотреть результаты профилирования в Android Studio, нажмите на ссылку Трассировка метода или Трассировка выборки стека в результатах микротестирования.

MethodTracing

Трассировка методов полезна при оптимизации кода, поскольку она помогает определить, какие методы выполняются дольше других. После этого вы сможете сосредоточиться на оптимизации методов, которые оказывают наибольшее влияние на эффективность.

Профилирование выполняется последовательно после измерения кода, поэтому в результатах теста будут и точные временные показатели, и результаты профилирования.

Трассировка методов включена по умолчанию.

Примечание. В некоторых версиях ОС Android и ART трассировка методов по умолчанию отключена. В таких случаях Android Studio выводит предупреждение.

StackSampling

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

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

В Android 10 (API 29) и более поздних версиях для выборки стеков вызовов приложения, включая код C++, используется Simpleperf. В Android 9 (API 28) и более ранних версиях для сбора образцов стека используется Debug.startMethodTracingSampling.

Чтобы настроить этот режим профилирования, добавьте ещё один аргумент инструментирования:

  • androidx.benchmark.profiling.sampleFrequency

    • Количество выборок стека, которые нужно собирать за секунду.
    • Тип аргумента: целое число.
    • Значение по умолчанию – 1000 выборок в секунду.
  • androidx.benchmark.profiling.sampleDurationSeconds

    • Продолжительность тестирования.
    • Тип аргумента: целое число.
    • Значение по умолчанию – 5 секунд.
  • androidx.benchmark.profiling.skipWhenDurationRisksAnr

    • Пропускает трассировку метода, если она может вызвать ошибку ANR. Рекомендуем оставить эту функцию включенной для непрерывной интеграции, поскольку ошибки ANR могут вызывать проблемы во время длительных запусков.
    • Тип аргумента: логическое значение
    • Значение по умолчанию – true.

Нет

Этот аргумент не захватывает файл профилирования. Информация о времени и распределении по-прежнему измеряется.