Comparar seu app

Fazer uma comparação é uma maneira de testar o desempenho do seu aplicativo. É possível realizar comparações regularmente para ajudar a analisar e depurar problemas de desempenho e garantir que não sejam introduzidas regressões em mudanças recentes.

Há duas bibliotecas e abordagens de comparação que o Android oferece, que são úteis para analisar e testar diferentes tipos de situações no seu aplicativo: Benchmark e Macrobenchmark.

Benchmark versus Macrobenchmark

A biblioteca Jetpack Benchmark permite comparar o código do app diretamente em um loop. Ela é projetada para medir o trabalho da CPU que avaliará o melhor desempenho (JIT com o app aberto em segundo plano, acessos ao disco em cache), como o que você pode ver em um loop interno ou em uma função quente específica.

As comparações são criadas para chamar diretamente o código que será comparado, desta forma:

@get:Rule
val benchmarkRule = BenchmarkRule()

@Test
fun myBenchmarkTest() {
    benchmarkRule.measureRepeated {
        // code or function call that you want to benchmark
    }
}

A biblioteca Benchmark relata informações apenas sobre o aplicativo, não sobre o sistema em geral. Por isso, é melhor usá-la para analisar o desempenho de situações específicas do app, e não aquelas que podem estar relacionadas a problemas gerais do sistema. Por exemplo, a inicialização do aplicativo envolve operações que acontecem tanto fora do app como antes da execução do código dele. Portanto, é útil ver essas informações ao pesquisar problemas de desempenho na inicialização. Os testes de Microbenchmark não são úteis para tentar corrigir esse caso de uso.

A biblioteca Macrobenchmark mede interações maiores do usuário final, como inicialização, rolagem e animações. Ao contrário da biblioteca Benchmark, a Macrobenchmark injeta eventos e monitora os resultados externamente, usando um aplicativo de teste fornecido por você.

Ela oferece controle direto sobre o ambiente de desempenho que está sendo testado. Por exemplo, é possível especificar o desempenho da inicialização inicial de primeira instalação, além das opções de inicialização "lenta" e "a quente", como mostrado neste exemplo adaptado do exemplo da Macrobenchmark:

@Test
fun startup() = benchmarkRule.measureStartup(
    packageName = "mypackage.myapp",
    metrics = listOf(StartupTimingMetric()),
    iterations = 5,
    startupMode = StartupMode.COLD
) {
    pressHome()
    startActivityAndWait(Intent().apply {
        action = "mypackage.myapp.myaction"
    })
}

Como parte dos resultados, a biblioteca Macrobenchmark produz arquivos de rastreamento que podem ser vistos no Android Studio para identificar problemas de desempenho para análise e depuração.

Benchmark Macrobenchmark
Medição de funções individuais Medição dos pontos de entrada de alto nível, por exemplo, inicialização de atividades ou rolagem de uma lista
Teste de trabalho da CPU no processo Teste do app completo fora do processo
Velocidade de iteração rápida (leva geralmente menos de 10 segundos) Velocidade de iteração lenta (leva geralmente vários minutos)
Amostragem de método e rastreamento opcionais Os resultados vêm com rastreamento de perfil
API mínima 14 API mínima 29