Benchmark

Meça com precisão o desempenho do seu código no Android Studio.
Atualização mais recente Versão estável atual Próximo candidato a lançamento Versão Beta Versão Alfa
16 de junho de 2021 1.0.0 - - 1.1.0-alpha03

Declarar dependências

Para adicionar uma dependência à biblioteca Benchmark, é preciso adicionar o repositório Maven do Google ao seu projeto. Leia Repositório Maven do Google para ver mais informações.

Adicione as dependências dos artefatos necessários no arquivo build.gradle para seu app ou módulo:

Groovy

dependencies {
    androidTestImplementation "androidx.benchmark:benchmark-junit4:1.0.0"
}

android {
    ...
    defaultConfig {
        ...
        testInstrumentationRunner "androidx.benchmark.junit4.AndroidBenchmarkRunner"
    }
}

Kotlin

dependencies {
    androidTestImplementation("androidx.benchmark:benchmark-junit4:1.0.0")
}

android {
    ...
    defaultConfig {
        ...
        testInstrumentationRunner = "androidx.benchmark.junit4.AndroidBenchmarkRunner"
    }
}

A biblioteca Benchmark também fornece um plug-in para Gradle para ser usado com seu módulo de comparações. Este plug-in define os padrões de configuração do build para o módulo, configura a cópia de saída de comparativo para o host e fornece a tarefa ./gradlew lockClocks.

Para usar o plug-in, inclua o seguinte classpath no arquivo build.gradle de nível superior:

Groovy

buildscript {
    repositories {
        google()
    }
    dependencies {
        classpath "androidx.benchmark:benchmark-gradle-plugin:1.0.0"
    }
}

Kotlin

buildscript {
    repositories {
        google()
    }
    dependencies {
        classpath("androidx.benchmark:benchmark-gradle-plugin:1.0.0")
    }
}

Em seguida, aplique o plug-in ao arquivo build.gradle do seu módulo de comparações.

Groovy

apply plugin: "androidx.benchmark"

Kotlin

plugins {
    id("androidx.benchmark")
}

Macrobenchmark

Para usar o Macrobenchmark no seu projeto, adicione as seguintes dependências ao arquivo build.gradle do seu app ou módulo:

Groovy

dependencies {
  androidTestImplementation "androidx.benchmark:benchmark-macro-junit4:1.1.0-alpha03"
}

Kotlin

dependencies {
  androidTestImplementation("androidx.benchmark:benchmark-macro-junit4:1.1.0-alpha03")
}

Feedback

Seu feedback ajuda a melhorar o Jetpack. Avise se você descobrir novos problemas ou tiver ideias para melhorar esta biblioteca. Consulte os problemas existentes nesta biblioteca antes de criar um novo. Adicione seu voto a um problema existente clicando no botão de estrela.

Criar novo problema

Consulte a documentação do Issue Tracker para saber mais.

Versão 1.1.0

Versão 1.1.0-alpha03

16 de junho de 2021

Lançamento de androidx.benchmark:benchmark-*:1.1.0-alpha03. A versão 1.1.0-alpha03 contém estas confirmações.

Novos recursos

Correções de bugs

  • O exemplo de código do Gradle para suprimir erros de comparação foi atualizado para usar uma API não descontinuada, com sintaxe compatível com usuários do .gradle.kts.

    Por exemplo:

    testInstrumentationRunnerArguments["androidx.benchmark.suppressErrors"] = "EMULATOR,LOW-BATTERY"
    

Versão 1.1.0-alpha02

18 de maio de 2021

A versão 1.1.0-alpha02 da Benchmark fornece um ótimo componente para comparações, o Macrobenchmark. Além de fazer comparações para avaliar as repetições de CPU, o macrobenchmark permite medir interações de apps inteiros, como inicialização e rolagem, e capturar traces. Para saber mais, consulte a documentação da biblioteca.

Lançamento de androidx.benchmark:benchmark-*:1.1.0-alpha02. A versão 1.1.0-alpha02 contém estas confirmações.

Novos recursos

Artefatos Macrobenchmark foram adicionados (androidx.benchmark:benchmark-macro-junit4 e androidx.benchmark:benchmark-macro)

  • Capture métricas de desempenho de inicialização, rolagem/animação do app localmente ou em CI
  • Capturar e inspecionar traces no Android Studio

Correções de bugs

  • Solução alternativa de problemas de permissões do shell com diretório de saída no Android 12. Observação: pode ser necessário atualizar o Plug-in do Android para Gradle para a versão 7.0.0 canary e o Android Studio para o Arctic Fox (2020.3.1) para continuar a captura de arquivos de saída nos dispositivos afetados (Icb039).
  • Compatibilidade de armazenamento em cache de configuração no BenchmarkPlugin (6be1c1, b/159804788).
  • Saída de arquivo simplificada, ativada por padrão, em um diretório que não requer requestLegacyExternalStorage=true (8b5a4d, b/172376362).
  • Corrige os avisos de exibição do logcat da biblioteca sobre não encontrar linhas de execução JIT em versões da plataforma em que ele não está presente (I9cc63, b/161847393).
  • Correção para leitura da frequência máxima do dispositivo (I55c7a).

Versão 1.1.0-alpha01

10 de junho de 2020

Lançamento de androidx.benchmark:benchmark-common:1.1.0-alpha01, androidx.benchmark:benchmark-gradle-plugin:1.1.0-alpha01 e androidx.benchmark:benchmark-junit4:1.1.0-alpha01. A versão 1.1.0-alpha01 contém estas confirmações.

Novos recursos da versão 1.1

  • Métrica de alocação: os comparativos agora executam uma fase adicional após o aquecimento e o tempo, captando as contagens de alocação. As alocações podem causar problemas de desempenho em versões mais antigas da plataforma (140 ns em O se tornaram 8 ns em M, medidos no Nexus5X, com relógios bloqueados). Essa métrica é exibida na saída do console do Android Studio, bem como na
  • Compatibilidade com criação de perfil: agora é possível capturar dados de criação de perfil para uma execução de um comparativo para inspecionar o motivo da lentidão no código. O Benchmark é compatível com a captura de rastreamento de método ou com a amostragem de método do ART. Esses arquivos podem ser inspecionados com o criador de perfil do Android Studio usando File > Open.
  • O plug-in Benchmark para Gradle agora fornece padrões para uma configuração mais simples:
    • testBuildType está definido para ser lançado por padrão, para evitar o uso de dependências com cobertura de código integrada. A versão buildType também foi configurada como padrão, o que permite que o Android Studio selecione automaticamente a variante de compilação correta ao abrir um projeto pela primeira vez (b/138808399).
    • signingConfig.debug é usado como a configuração de assinatura padrão (b/153583269).

** Correções de bugs **

  • A sobrecarga da transição de aquecimento foi reduzida significativamente, em que a primeira medição de cada comparativo era artificialmente maior do que as outras. Esse problema era mais pronunciado em comparativos muito pequenos (1 microssegundos ou menos) (b/142058671).
  • Correção do erro InstrumentationResultParser impresso para cada comparativo ao ser executado na linha de comando (I64988, b/154248456).

Problemas conhecidos

  • Invocações do Benchmark para Gradle na linha de comando não imprimem resultados diretamente. Você pode contornar isso executando o Studio ou analisando o arquivo de saída JSON para ver os resultados.
  • Os relatórios do Benchmark não extraem o relatório de dispositivos que têm um app instalado com um applicationId que termina com "android" ou "download" (não diferencia maiúsculas e minúsculas). Os usuários com esse problema devem fazer upgrade do Plug-in do Android para Gradle para 4.2-alpha01 ou mais recente.

Versão 1.0.0

Benchmark versão 1.0.0

20 de novembro de 2019

Lançamento de androidx.benchmark:benchmark-common:1.0.0, androidx.benchmark:benchmark-gradle-plugin:1.0.0 e androidx.benchmark:benchmark-junit4:1.0.0, sem alterações desde a versão 1.0.0-rc01. A versão 1.0.0 contém estas confirmações.

Principais recursos da versão 1.0.0

A biblioteca Benchmark permite criar comparativos de desempenho do código do app e conseguir resultados rapidamente.

Isso evita problemas de configuração de build e de tempo de execução e estabiliza o desempenho do dispositivo para garantir que as medidas sejam precisas e consistentes. Execute os comparativos diretamente no Android Studio ou em integração contínua para observar o desempenho do código ao longo do tempo e evitar regressões.

Os principais recursos incluem:

  • Estabilização do relógio
  • Priorização automática de linhas de execução
  • Compatibilidade com testes de desempenho de IU, por exemplo, no RecyclerView de exemplo (link em inglês)
  • Aquecimento e looping compatíveis com JIT
  • Resultado de comparativo JSON para pós-processamento

Versão 1.0.0-rc01

23 de outubro de 2019

Lançamento de androidx.benchmark:benchmark-common:1.0.0-rc01, androidx.benchmark:benchmark-gradle-plugin:1.0.0-rc01 e androidx.benchmark:benchmark-junit4:1.0.0-rc01. A versão 1.0.0-rc01 contém estas confirmações.

Novos recursos

  • Inclusão do rastreamento do systrace nos comparativos

Correções de bugs

  • Corrigido o problema de instabilidade de métrica, em que o JIT não terminava antes do aquecimento devido a não priorização (b/140773023).
  • O diretório de saída JSON foi unificado no Plug-in do Android para Gradle 3.5 e 3.6

Versão 1.0.0-beta01

9 de outubro de 2019

Lançamento de androidx.benchmark:benchmark-common:1.0.0-beta01, androidx.benchmark:benchmark-gradle-plugin:1.0.0-beta01 e androidx.benchmark:benchmark-junit4:1.0.0-beta01. A versão 1.0.0-beta01 contém estas confirmações.

Novos recursos

  • Executa a coleta de lixo antes de cada aquecimento para reduzir a pressão de memória de um comparativo ao vazar para o próximo (b/140895105).

Correções de bugs

  • Incluída a dependência androidx.annotation:android-experimental-lint, para que o código Java produza corretamente erros de lint quando a API experimental não for usada, de forma semelhante ao que é oferecido pela anotação experimental Kotlin para os autores de chamada do Kotlin.
  • Agora o uso do argumento de instrumentação additionalTestOutputDir para saída no Plugin do Gradle para Android 3.6 é detectado corretamente, para saber quando o AGP realizará a cópia de dados.
  • Corrigida a frequência do relógio não detectada em JSON para imprimir -1 corretamente (b/141945670).

Versão 1.0.0-alpha06

18 de setembro de 2019

Lançamento de androidx.benchmark:benchmark-common:1.0.0-alpha06, androidx.benchmark:benchmark-gradle-plugin:1.0.0-alpha06 e androidx.benchmark:benchmark-junit4:1.0.0-alpha06. A versão 1.0.0-alpha06 contém estas confirmações.

Novos recursos

  • Incluída uma verificação de uso incorreto do pacote antigo para execução de testes, que agora apresenta uma mensagem de erro mais útil.

Mudanças na API

  • A anotação experimental ExperimentalAnnotationReport agora está pública da forma correta. Agora, o uso da API experimental BenchmarkState#report exige essa anotação.

Versão 1.0.0-alpha05

5 de setembro de 2019

Lançamento de androidx.benchmark:benchmark-common:1.0.0-alpha05, androidx.benchmark:benchmark-gradle-plugin:1.0.0-alpha05 e androidx.benchmark:benchmark-junit4:1.0.0-alpha05. As confirmações incluídas nessa versão podem ser encontradas aqui.

Mudanças na API

  • A API BenchmarkState.reportData agora está marcada como experimental.

Correções de bugs

  • Corrigido o script de bloqueio do relógio, que falhava em dispositivos que não tinham os recursos de shell cut ou expr.
  • Corrigido problema com a tarefa ./gradlew lockClocks, que era mantida em dispositivos com acesso root à versão mais antiga do utilitário su, que não era compatível com a sinalização -c.

Versão 1.0.0-alpha04

7 de agosto de 2019

Lançamento de androidx.benchmark:benchmark-common:1.0.0-alpha04, androidx.benchmark:benchmark-gradle-plugin:1.0.0-alpha04 e androidx.benchmark:benchmark-junit4:1.0.0-alpha04. As confirmações incluídas nessa versão podem ser encontradas aqui.

Também foi adicionada uma nova documentação sobre como usar a biblioteca Benchmark sem o Gradle, tanto para uso em diferentes sistemas de compilação (como Bazel ou Buck), quanto para execução em CI. Para ver mais informações, consulte Comparativos de compilação sem o Gradle e Executar comparativos na integração contínua.

Novos recursos

  • Plug-in do Gradle
    • Agora, ele desativa automaticamente a cobertura de teste e define o AndroidBenchmarkRunner por padrão (b/138374050).
    • Incluída a compatibilidade com nova cópia de dados baseada no AGP, ao executar benchmarks e ao usar AGP 3.6+.
  • Adições ao formato JSON
    • Tempo total de execução do teste de comparativos de saída (b/133147694).
    • Benchmarks @Parameterized que usam uma string de nome (por exemplo, @Parameters(name = "size={0},depth={1}")) agora emitem nomes e valores de parâmetro por benchmark na saída JSON (b/132578772).
  • Modo de simulação b/138785848.
    • Adicionado um modo de "simulação" para executar cada loop de benchmark apenas uma vez, para verificar se há erros/falhas sem capturar medições. Isso pode ser útil, por exemplo, para executar benchmarks rapidamente no pré-envio, verificando se eles não estão corrompidos.

Mudanças na API

  • A estrutura do módulo mudou, dividindo a biblioteca (b/138451391).
    • benchmark:benchmark-junit4 contém classes com dependência JUnit: AndroidBenchmarkRunner e BenchmarkRule, que foram movidas para o pacote androidx.benchmark.junit4
    • benchmark:benchmark-common contém o restante da lógica, incluindo a API BenchmarkState.
    • Essa divisão permitirá que a biblioteca seja compatível com o benchmark sem as APIs do JUnit4 no futuro.
  • Os avisos de configuração agora são tratados como erros e fazem com que o teste falhe b/137653596.
    • Isso é feito para incentivar ainda mais medições precisas, especialmente na integração contínua (CI, na sigla em inglês).
    • Esses erros podem ser reduzidos a avisos com um argumento de instrumentação. Por exemplo: -e androidx.benchmark.suppressErrors "DEBUGGABLE,LOW_BATTERY"

Correções de bugs

  • Erros ao gravar no armazenamento externo em dispositivos Q exibem mensagens mais descritivas, com sugestões de como resolver o problema.
  • As telas são ativadas automaticamente durante as execuções de benchmarks, em vez de falhar quando a tela está desativada.

Contribuições externas

  • Agradecemos a Sergey Zakharov pela contribuição para as melhorias da saída JSON e para a correção dos problemas relacionados à tela desativada.

Versão 1.0.0-alpha03

2 de julho de 2019

Lançamento de androidx.benchmark:benchmark:1.0.0-alpha03 e androidx.benchmark:benchmark-gradle-plugin:1.0.0-alpha03. As confirmações incluídas nessa versão podem ser encontradas aqui.

Novos recursos

  • Exposição da duração do modo de espera devido à limitação térmica por benchmark no relatório JSON completo.

Correções de bugs

  • O plug-in do Gradle não precisa mais ser aplicado depois dos plug-ins do Android e do bloco do Android.
  • Adiciona compatibilidade com relatórios de comparação em dispositivos Android 10 usando armazenamento com escopo

Versão 1.0.0-alpha02

6 de junho de 2019

Lançamento de androidx.benchmark:1.0.0-alpha02 e androidx.benchmark:benchmark-gradle-plugin:1.0.0-alpha02. As confirmações incluídas nessa versão podem ser encontradas neste link (link em inglês).

Observe que estamos tratando o esquema JSON como uma API. Pretendemos seguir as mesmas restrições de estabilidade de outras APIs: estável (com raras exceções), uma vez na versão Beta e corrigida na versão final, com apenas algumas adições em versões secundárias e alterações/remoções nas versões principais.

Mudanças na API

  • Esquema JSON revisado. É provável que outras mudanças no esquema JSON sejam limitadas a adições:

    • Reorganizada a estrutura do objeto de resultado para oferecer compatibilidade com outros grupos de métricas no futuro (b/132713021).
    • Adicionadas informações de contexto de execução de teste, como informações do dispositivo e da compilação e se os clocks estão bloqueados, ao objeto de nível superior (b/132711920).
    • Os nomes das métricas de tempo agora têm "ns" (b/132714527).
    • Adicionadas outras estatísticas por métrica relatada (máxima, mediana, mínima) e remoção de estatísticas resumidas "nanos" simplificadas (b/132713851).
  • Remoção de saída XML (b/132714414).

  • A detecção da limitação térmica foi removida da API BenchmarkState.reportData (b/132887006).

Correções de bugs

  • Correção de ./gradlew lockClocks que não fixavam em alguns dispositivos com SO recente (b/133424037).
  • Desativada a detecção de limitação para emulador (b/132880807).

Versão 1.0.0-alpha01

7 de maio de 2019

Lançamento de androidx.benchmark:benchmark:1.0.0-alpha01. As confirmações incluídas nessa versão podem ser encontradas neste link.