Microbenchmark

A biblioteca Jetpack Microbenchmark permite comparar seu código nativo do Android (Kotlin ou Java) no Android Studio. A biblioteca lida com o aquecimento, mede o desempenho do código e as contagens de alocação e gera resultados comparativos no Console do Android Studio e em um arquivo JSON com mais detalhes.

Recomendamos criar um perfil para seu código antes de programar uma comparação. Isso ajuda você a encontrar operações caras que valem a pena otimizar. Ele também pode indicar por que as operações estão lentas, mostrando o que está acontecendo durante a execução, por exemplo, execução em uma linha de baixa prioridade, suspensão devido a acesso ao disco ou chamada inesperada em uma função cara, como a decodificação de bitmap.

As microcomparações são úteis principalmente para trabalhos da CPU executados várias vezes no app, também conhecidos como caminhos de código quente. Alguns exemplos: rolagem de RecyclerView com um item exibido por vez, conversões ou processamento de dados e outros trechos de código que são usados repetidamente.

Outros tipos de código são mais difíceis de medir com a biblioteca Microbenchmark. Como as comparações são executadas em loop, qualquer código que não seja executado com frequência ou que apresente desempenhos diferentes quando chamado várias vezes pode não funcionar para a comparação.

Para aprender a usar a biblioteca em um ambiente de integração contínua (CI), consulte Executar comparações na integração contínua.

Evitar a medição do cache

Tente evitar medir apenas o cache. Por exemplo, uma comparação para o layout de uma visualização personalizada pode medir apenas o desempenho do cache de layout. Para evitar isso, você pode transmitir diferentes parâmetros de layout em cada loop. Isso pode ser difícil em outros casos, como ao medir a performance do sistema de arquivos, porque o SO armazena o sistema de arquivos em cache durante o loop.

Receber comparações consistentes

Os relógios em dispositivos móveis mudam dinamicamente do estado alto (para maior desempenho) para o estado baixo (para economizar energia ou quando o dispositivo esquenta). Esses relógios variados podem fazer com que os números de comparação variem muito. Por esse motivo, a biblioteca oferece maneiras de lidar com esse problema.

Bloquear os relógios (dispositivo com acesso root necessário)

Bloquear os relógios é a melhor maneira de alcançar um desempenho estável. Isso garante que os relógios nunca cheguem a um estado alto o suficiente para aquecer o dispositivo ou um estado baixo caso uma comparação não esteja utilizando a CPU totalmente. O recurso pode ser aplicado com uma tarefa do Gradle (gradlew lockClocks) ou manualmente na CI. Embora essa seja a melhor maneira de ajudar a garantir um desempenho estável, ela não é aceita pela maioria dos dispositivos, porque exige tecnologia Android com acesso root.

Modo de desempenho sustentado

Window.setSustainedPerformanceMode() é um recurso oferecido por dispositivos que permitem que um app opte por uma frequência máxima de CPU mais baixa. Quando executado em dispositivos com suporte, a biblioteca Microbenchmark usa uma combinação dessa API e inicia a própria atividade para impedir a limitação térmica e estabilizar os resultados.

Esse recurso é ativado por padrão pelo testInstrumentationRunner definido pelo Plug-in do Android para Gradle. Caso queira usar um executor personalizado, é possível criar uma subclasse AndroidBenchmarkRunner e usá-la como seu testInstrumentationRunner.

O executor lança uma atividade opaca em tela cheia para garantir que a comparação seja executada em primeiro plano e sem qualquer outro app drenando a bateria.

Pausar a execução automática

Se você não usar bloqueio de relógio ou desempenho sustentado, a biblioteca vai realizar a detecção automática de limitação térmica. Quando ativada, a comparação interna é executada periodicamente para determinar quando a temperatura do dispositivo ficou alta o suficiente para diminuir o desempenho da CPU. Quando ele detecta que o desempenho da CPU foi reduzido, a biblioteca pausa a execução para permitir que o dispositivo esfrie e tenta fazer a comparação atual de novo.

Compilação AOT

Microcomparações complexas podem levar muito tempo para se estabilizar e tornar a estabilização é muito difícil de detectar. Como uma medição consistente e rápida velocidade de iteração são as principais prioridades, o plug-in androidx.benchmark totalmente compila seu apk de microbenchmark por padrão, semelhante a CompilationMode.Full em Macrobenchmarks. Esse comportamento exige uma comparação 1.3.0-beta01+ e o Plug-in do Android para Gradle 8.4.0+. É possível desativar essa opção comportamento, definindo androidx.benchmark.forceaotcompilation=false na sua arquivo gradle.properties.

Amostras

Confira os seguintes exemplos no repositório do GitHub:

Outros recursos

Enviar feedback

Para comunicar problemas ou enviar solicitações de recursos usando a comparação, consulte o rastreador de problemas público.