Capturar métricas de Macrobenchmark

Conceitos e implementação do Jetpack Compose

As métricas são o principal tipo de informação extraída das comparações. Elas são transmitidas para a measureRepeated função como uma List, permitindo especificar várias métricas medidas de uma só vez. Pelo menos um tipo de métrica é necessário para que a comparação seja executada.

O snippet de código abaixo captura as métricas de marcação do tempo para a renderização do frame e as da seção de rastros personalizados:

Kotlin

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
    // ...
);

Nesse exemplo, RV CreateView e RV OnBindView são os IDs de blocos rastreáveis definidos em RecyclerView. O código-fonte para o método createViewHolder() é um exemplo de como definir blocos rastreáveis no seu código.

StartupTimingMetric, TraceSectionMetric e FrameTimingMetric são abordados em detalhes mais adiante neste documento. Para uma lista completa de métricas, confira as subclasses de Metric.

Os resultados das comparações são gerados no Android Studio, conforme mostrado na figura 1. Se várias métricas forem definidas, todas serão combinadas na saída.

Resultados de TraceSectionMetric e FrameTimingMetric.
Figura 1. Resultados de TraceSectionMetric e FrameTimingMetric.

StartupTimingMetric

StartupTimingMetric captura métricas de marcação de tempo de inicialização do app com estes valores:

  • timeToInitialDisplayMs: tempo total entre o momento em que o sistema recebe uma intent de inicialização e a renderização do primeiro frame do destino Activity.
  • timeToFullDisplayMs: tempo total entre o momento em que o sistema recebe uma intent de inicialização e o momento em que o app é totalmente renderizado usando o reportFullyDrawn() método. A medição será interrompida quando a renderização do primeiro frame após (ou que contém) a chamada reportFullyDrawn() for concluída. Essa medição pode não estar disponível no Android 10 (nível 29 da API) e versões anteriores.

A StartupTimingMetric gera os valores mínimos, medianos e máximos das iterações de inicialização. Para avaliar a melhoria da inicialização, concentre-se sempre nos valores medianos, porque eles oferecem a melhor estimativa dos tempos de inicialização típicos do usuário. Para mais informações sobre o que contribui para o tempo de inicialização do aplicativo, consulte Tempo de inicialização do app.

Resultados da StartupTimingMetric
Figura 2. Resultados de StartupTimingMetric.

FrameTimingMetric

FrameTimingMetric captura informações de tempo de frames produzidos por uma comparação (por exemplo, uma rolagem ou animação) e gera os valores abaixo:

  • frameOverrunMs: por quanto tempo um frame específico perdeu o prazo. Números positivos indicam uma queda de frame acompanhada de instabilidade ou travamento visíveis. Números negativos indicam a rapidez com que um frame foi concluído em relação ao prazo do hardware do subsistema. Observação: essa métrica está disponível apenas no Android 12 (nível 31 da API) e versões mais recentes.
  • frameDurationCpuMs: o tempo necessário para que o frame seja produzido na CPU na linha de execução de interface e na RenderThread.

Essas medidas são coletadas em uma distribuição de percentis 50, 90, 95 e 99.

Para mais informações sobre a identificação e melhoria de frames lentos, consulte Renderização lenta.

Resultados da FrameTimingMetric
Figura 3. Resultados de FrameTimingMetric.

TraceSectionMetric

TraceSectionMetric captura o número de vezes que uma seção de trace específica ocorre e o tempo absoluto necessário para a execução. Para o rastreamento de tempo, ela gera os tempos mínimo, mediano e máximo em milissegundos.

A seção de trace de destino é definida pela chamada de função trace(sectionName) ou pelos limites de bloco de nível inferior entre Trace.beginSection(sectionName) e Trace.endSection() ou as variantes assíncronas deles. Ela sempre seleciona a primeira instância de uma seção de rastreamento capturada durante uma medição. Por padrão, ele só exibe seções de trace do pacote. Para incluir processos fora do pacote, defina targetPackageOnly = false.

Para ver mais informações sobre rastreamento, consulte Visão geral do rastreamento do sistema e Definir eventos personalizados.

TraceSectionMetric
Figura 4. Resultados de TraceSectionMetric.