As métricas são o principal tipo de informação extraída das comparações. Elas
são transmitidas para a função measureRepeated
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 do método createViewHolder()
é um exemplo de como definir blocos rastreáveis no seu
código.
As métricas StartupTimingMetric
,
TraceSectionMetric
,
FrameTimingMetric
e PowerMetric
serão abordadas
em mais detalhes posteriormente neste documento.
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.](https://developer.android.google.cn/static/topic/performance/images/benchmark_images/macrobenchmark_results_frames_tracing.png?authuser=9&hl=pt)
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 daActivity
de destino.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 métodoreportFullyDrawn()
. A medição será interrompida quando a renderização do primeiro frame após (ou que contém) a chamadareportFullyDrawn()
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 nos valores medianos,
porque eles oferecem a melhor estimativa do tempo normal de inicialização. 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](https://developer.android.google.cn/static/topic/performance/images/benchmark_images/macrobenchmark_results_fully_drawn_startup.png?authuser=9&hl=pt)
StartupTimingMetric
.FrameTimingMetric
A FrameTimingMetric
captura informações de marcação de tempo de frames produzidos por uma
comparação (por exemplo, uma rolagem ou animação) e gera estes valores:
frameOverrunMs
: por quanto tempo um frame específico perdeu o prazo. Números positivos indicam uma queda de frame e instabilidade ou travamento perceptíveis. Números negativos indicam a velocidade de renderização de um frame em relação ao prazo. Observação: 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 naRenderThread
.
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](https://developer.android.google.cn/static/topic/performance/images/benchmark_images/macrobenchmark_results_frames.png?authuser=9&hl=pt)
FrameTimingMetric
.TraceSectionMetric
TraceSectionMetric
captura o número de vezes que uma seção de trace correspondente ao sectionName
fornecido ocorre e o tempo gasto. Ela gera os tempos mínimo,
mediano e máximo em milissegundos. A seção de rastreamento é definida pela chamada de função
trace(sectionName)
ou pelo código 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 mais informações sobre rastreamento, consulte a Visão geral do rastreamento do sistema e Definir eventos personalizados.
![TraceSectionMetric](https://developer.android.google.cn/static/topic/performance/images/benchmark_images/macrobenchmark_results_tracing.png?authuser=9&hl=pt)
TraceSectionMetric
.PowerMetric
A PowerMetric
captura
a mudança de energia durante o teste para as
categorias de energia fornecidas.
Cada categoria selecionada é dividida em subcomponentes mensuráveis, e as
categorias não selecionadas são adicionadas à métrica "não selecionada".
Essas métricas medem o consumo do sistema, não o consumo por app, e são limitadas aos dispositivos Pixel 6, Pixel 6 Pro e mais recentes:
power<category>Uw
: quantidade de energia consumida durante o teste da categoria.energy<category>Uws
: quantidade de energia transferida por unidade de tempo durante o teste da categoria.
As categorias incluem:
CPU
DISPLAY
GPU
GPS
MEMORY
MACHINE_LEARNING
NETWORK
UNCATEGORIZED
Com algumas categorias, como CPU
, pode ser difícil separar o trabalho feito por
outros processos do trabalho feito pelo seu app. Para minimizar a interferência,
remova ou restrinja contas e apps desnecessários.
![Resultados de PowerMetric](https://developer.android.google.cn/static/topic/performance/images/benchmark_images/macrobenchmark_results_power.png?authuser=9&hl=pt)
PowerMetric
.Recomendados para você
- Observação: o texto do link aparece quando o JavaScript está desativado.
- Criar perfis de referência {:#creating-profile-rules}
- Como criar uma comparação da Macrobenchmark
- Otimização e análise de inicialização do app {:#app-startup-analysis-optimization}