Benchmark

A biblioteca Benchmark facilita a comparação de códigos baseados em Kotlin ou Java no Android Studio. A biblioteca gerencia o aquecimento, mede o desempenho do seu código e gera resultados comparativos para o console do Android Studio.

Para ver mais informações sobre como usar a biblioteca Benchmark no seu app ou biblioteca, consulte Comparar o código do app.

Avalie 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
20 de novembro de 2019 1.0.0 - - -

Como 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:

    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 comparativo de mercado. Este plug-in define os padrões de configuração para o módulo, configura 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:

    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 comparativo de mercado.

apply plugin: "androidx.benchmark"

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 (link em inglês) nesta biblioteca antes de criar um novo. Adicione seu voto a um problema existente clicando no botão de estrela.

Criar novo problema (link em inglês)

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

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 essas confirmações (link em inglês).

Principais recursos da versão 1.0.0

A biblioteca Benchmark permite criar benchmarks 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 benchmarks 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 de clock
  • Priorização automática de linhas de execução
  • Compatibilidade com testes de desempenho de IU, por exemplo, na Amostra RecyclerView(link em inglês)
  • Aquecimento e looping compatíveis com JIT
  • Resultado de benchmark 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 essas confirmações (link em inglês).

Novos recursos

  • Inclusão do rastreamento do systrace nos benchmarks

Correções de bugs

  • Corrigido problema de instabilidade de métrica, em que o JIT não terminava antes do aquecimento devido a não priorização (b/140773023, link em inglês)
  • 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 essas confirmações (link em inglês).

Novos recursos

  • Executa a coleta de lixo antes de cada aquecimento para reduzir a pressão de memória de um benchmarks para o vazamento para o próximo (b/140895105, link em inglês)

Correções de bugs

  • Incluída 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 frequência de clock não detectada em JSON para imprimir -1 (b/141945670, link em inglês) corretamente.

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 essas confirmações (link em inglês).

Novos recursos

  • Incluída 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 (link em inglês).

Mudanças na API

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

Correções de bugs

  • Corrigido script de bloqueio de clock, 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 (link em inglês).

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 Criar benchmarks sem o Gradle e Executar benchmarks em 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, link em inglês).
    • Incluída 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 benchmarks 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, link em inglês).
  • Modo de simulação b/138785848 (link em inglês)
    • 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 (link em inglês)
    • 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 (link em inglês).
    • 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 neste link (link em inglês).

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 (link em inglês)
    • 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 (link em inglês)
    • Os nomes das métricas de tempo agora têm "ns" b/132714527 (link em inglês)
    • Adicionadas outras estatísticas por métrica relatada (máxima, mediana, mínima) e remoção de estatísticas resumidas "nanos" simplificadas b/132713851 (link em inglês)
  • Remoção de saída XML b/132714414 (link em inglês)

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

Correções de bugs

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

Versão 1.0.0-alpha01

7 de maio de 2019

androidx.benchmark:benchmark:1.0.0-alpha01 é lançado. As confirmações incluídas nessa versão podem ser encontradas neste link (link em inglês).