page.title=Teste de desempenho de exibição page.image=images/cards/card-test-performance_2x.png page.keywords=performance, fps, tools @jd:body

Neste documento

  1. Medir desempenho da IU
  2. Automatizar teste de desempenho da IU

O teste de desempenho da interface do usuário (IU) garante que o aplicativo não só esteja de acordo com os requisitos funcionais, como também que as interações de usuários sejam muito mais suaves, executando a 60 quadros por segundo de forma consistente (por que 60 qps?), sem nenhum quadro atrasado ou descartado ou, como gostamos de chamar, "jank". Este documento explica as ferramentas disponíveis para medir o desempenho da IU e dispõe uma abordagem para integrar as medidas de desempenho de IU nas práticas de teste.

Medir desempenho da IU

Para aprimorar o desempenho, deve-se primeiro ter a habilidade de medir o desempenho do sistema e, em seguida, diagnosticar e identificar problemas que podem ocorrer em várias partes do processo.

dumpsys é uma ferramenta do Android que é executada no dispositivo e despeja informações interessantes sobre o estado dos serviços do sistema. Passar o comando gfxinfo para dumpsys fornece uma saída no logcat com informações de desempenho relacionada aos quadros de animação que ocorrem durante a fase de registro.

> adb shell dumpsys gfxinfo <PACKAGE_NAME>

Este comando pode produzir diversas variáveis de dados de precisão de quadro.

Agregar estatísticas de quadro

Com o M Preview, o comando emite uma análise agregada dos dados de quadro para logcat, coletados em todo o ciclo de vida do processo. Por exemplo:

Stats since: 752958278148ns
Total frames rendered: 82189
Janky frames: 35335 (42.99%)
90th percentile: 34ms
95th percentile: 42ms
99th percentile: 69ms
Number Missed Vsync: 4706
Number High input latency: 142
Number Slow UI thread: 17270
Number Slow bitmap uploads: 1542
Number Slow draw: 23342

Estas estatísticas de alto nível carregam um alto nível de desempenho de renderização do aplicativo, bem como a estabilidade em vários quadros.

Informações de precisão de quadro

Com o M Preview, há um novo comando para gfxinfo, o framestats, que fornece informações de precisão de quadros extremamente detalhadas dos quadros recentes para que você possa rastrear e depurar os problemas de forma mais precisa.

>adb shell dumpsys gfxinfo <PACKAGE_NAME> framestats

Este comando emite informações de precisão de quadros, com marcações de data e hora, dos últimos 120 quadros produzidos pelo aplicativo. Abaixo, há um exemplo de saída bruta das estatísticas de quadro de adb dumpsys gfxinfo <PACKAGE_NAME>:

0,49762224585003,49762241251670,9223372036854775807,0,49762257627204,49762257646058,49762257969704,49762258002100,49762265541631,49762273951162,49762300914808,49762303675954,
0,49762445152142,49762445152142,9223372036854775807,0,49762446678818,49762446705589,49762447268818,49762447388037,49762453551527,49762457134131,49762474889027,49762476150120,
0,49762462118845,49762462118845,9223372036854775807,0,49762462595381,49762462619287,49762462919964,49762462968454,49762476194547,49762476483454,49762480214964,49762480911527,
0,49762479085548,49762479085548,9223372036854775807,0,49762480066370,49762480099339,49762481013089,49762481085850,49762482232152,49762482478350,49762485657620,49762486116683,

Cada linha desta saída representa um quadro produzido pelo aplicativo. Cada linha tem um número fixo de colunas que descrevem o tempo gasto em cada estágio do pipeline que produz quadros. A próxima seção descreve este formato com detalhes, incluindo o que cada coluna representa.

Formato de dados de estatísticas de quadro

Como o bloco de dados é a saída no formato CSV, basta colá-lo na ferramenta de planilha de sua escolha ou coletá-lo e analisá-lo com o script. A tabela a seguir explica o formato das colunas de dados de saída. Todas as marcações de data e hora estão em nanossegundos.

É possível usar estes dados de várias formas. Uma visualização simples mas útil é o histograma exibindo a distribuição dos tempos dos quadros (FRAME_COMPLETED - INTENDED_VSYNC) em diferentes espaços de latência. Consulte a figura abaixo. Este gráfico mostra brevemente que a maioria dos quadros estavam bons — bem abaixo do limite de 16 ms (representado em vermelho) —, mas que alguns quadros estavam bem acima do limite. Podemos verificar as alterações neste histograma com o tempo para encontrar as mudanças indiscriminadas ou novas exceções sendo criadas. Também é possível colocar em gráfico a latência de entrada, o tempo gasto no layout ou outras medidas interessantes com base nas várias marcações de data e hora nos dados.

Despejo de precisão de quadro simples

Se a renderização de GPU de perfil for definida para em adb shell dumpsys gfxinfo nas opções de desenvolvedor, o comando adb shell dumpsys gfxinfo emitirá informações de precisão para os 120 quadros mais recentes, divididas em algumas categorias com valores separados por guias. Estes dados podem ser úteis para indicar quais partes do pipeline de desenho podem estar lentas em um nível alto.

Semelhante às estatísticas de quadro acima, basta colá-los na ferramenta de planilha de sua escolha ou coletá-los e analisá-los com um script. O gráfico a seguir exibe um detalhamento de onde os vários quadros produzidos pelo aplicativo gastaram o tempo.

O resultado de executar gfxinfo, copiar a saída, colá-lo no aplicativo de planilha e gerar um gráfico dos dados como barras empilhadas.

Cada barra vertical representa um quadro da animação; sua altura representa a quantidade de milissegundos para calcular este quadro de animação. Cada segmento colorido da barra representa um estágio diferente do pipeline de renderização para que você possa ver que partes do aplicativo podem estar criando um afunilamento. Para obter mais informações sobre o entendimento do pipeline de renderização e como otimizá-lo, assista ao vídeo Invalidações, layouts e desempenho.

Controlar janela de coleta de estatísticas

As precisões de quadro simples e estatísticas de quadro coletam dados em um período muito curto — cerca de dois segundos de renderização. Para controlar este período de forma precisa — por exemplo, restringir os dados para uma animação em particular —, é possível redefinir todos os contadores e agregar as estatísticas coletadas.

>adb shell dumpsys gfxinfo <PACKAGE_NAME> reset

Isto também pode ser usado em conjunto com os próprios comandos de despejo para coletar e redefinir em uma cadência regular, capturando períodos de menos de dois segundos de quadros continuamente.

Diagnosticar regressões de desempenho

A identificação de regressões é uma boa primeira etapa para rastrear os problemas e manter o bem-estar do aplicativo. No entanto, o dumpsys identifica apenas a existência e a gravidade relativa dos problemas. Ainda é necessário diagnosticar a causa particular dos problemas de desempenho e encontrar maneiras adequadas de resolvê-los. Para isso, é altamente recomendado o uso da ferramenta systrace.

Recursos adicionais

Para obter mais informações sobre como o pipeline de renderização do Android funciona, problemas comuns que podem ser encontrados e como resolvê-los, alguns dos seguintes recursos podem ser úteis:

Automatizar teste de desempenho da IU

Uma abordagem para o teste de desempenho da IU é fazer com que um testador humano realize uma série de operações de usuário no aplicativo-alvo e procure visualmente problemas ou gaste uma grande quantidade de tempo usando uma abordagem de ferramenta para encontrá-los. No entanto, esta abordagem manual é repleta de riscos: a habilidade humana de notar alterações na taxa de quadros varia tremendamente, além de consumir tempo, ser tedioso e propenso a erros.

Uma abordagem mais eficiente é registrar e analisar as métricas de desempenho essenciais dos testes de IU automatizados. O Android M Developer Preview inclui novas capacidades de registro que facilitam a determinação da quantidade e da gravidade de erros nas animações do aplicativo e que podem ser usadas para compilar um processo rigoroso para determinar o desempenho atual e rastrear os futuros objetivos de desempenho.

Este artigo mostra uma abordagem recomendada para usar estes dados para automatizar o teste de desempenho.

Ele é geralmente dividido em duas ações principais. Primeiro: identificar o que está testando e como será testado. Segundo: configuração e manutenção de um ambiente de teste automatizado.

Configurar de testes da IU

Antes de iniciar o teste automatizado, é importante determinar algumas decisões de alto nível para entender corretamente o espaço de teste e as possíveis necessidades.

Identificar principais animações/fluxos a testar

Lembre-se que um desempenho ruim é mais visível aos usuários quando interrompe uma animação suave. Portanto, ao identificar que tipos de ações de IU serão testadas, é útil se concentrar nas animações principais que os usuários veem ou nas mais importantes para a experiência. Por exemplo, eis alguns cenários comuns que pode ser útil identificar:

Trabalhe com engenheiros, designers, e gerentes de produto em sua equipe para priorizar as animações de produto essenciais para a cobertura de teste.

Defina os futuros objetivos e faça um rastreamento

De um alto nível, talvez seja essencial identificar os objetivos específicos de desempenho e concentrar-se em escrever testes e coletar dados. Por exemplo:

Em todos esses casos, você optará pelo rastreamento histórico, que exibe o desempenho entre várias versões do aplicativo.

Identificar dispositivos para realizar testes

O desempenho do aplicativo varia dependendo do dispositivo em que está sendo executado. Alguns dispositivos podem conter menos memória, GPUs menos eficientes ou chips de CPU mais lentos. Isto significa que as animações que podem ter um bom desempenho em um conjunto de hardwares podem não ter o mesmo desempenho em outras, podendo ser o resultado de um afunilamento em uma parte diferente do pipeline. Portanto, para contabilizar esta variação em o que o usuário pode ver, escolha uma variação de dispositivos para executar os testes: dispositivos e tablets de alto e baixo nível etc. Procure variações no desempenho de CPU, RAM, densidade da tela, tamanho etc. Testes que passam em dispositivos de alto nível podem falhar em dispositivos de baixo nível.

Estruturas básicas para teste de IU

Conjuntos de ferramenta, como UI Automator e Espresso, são integrados para ajudar na automatização da ação de um usuário movendo-se pelo aplicativo. São estruturas simples que imitam a interação de usuário no dispositivo. Para usar estas estruturas, você cria efetivamente scripts únicos que executam um conjunto de ações de usuário e reproduzem-nas no próprio dispositivo.

Ao combinar estes testes automatizados, juntamente com dumpsys gfxinfo, é possível criar rapidamente um sistema reproduzível que permite a execução de um teste e a medição das informações de desempenho desta condição em particular.

Configurar testes automatizados da IU

Com a habilidade de executar um teste de IU e um pipeline para coletar os dados de um único teste, a próxima etapa importante é adotar uma estrutura que pode executar esse teste várias vezes, em vários dispositivos, e agregar os dados de desempenho resultados para futuras análises da equipe de desenvolvimento.

Uma estrutura para automatização de testes

Vale observar que as estruturas de teste de IU (como o UI Automator) são executadas diretamente no emulador/dispositivo alvo. Enquanto as informações de coleta de desempenho feita pelo dumpsys gfxinfo forem direcionadas por uma máquina hospedeira, envie comandos pelo ADB. Para ajudar a transmitir a automatização dessas entidades separadas, a estrutura MonkeyRunner foi desenvolvida: um sistema de script que é executado na máquina host que pode emitir comandos para um conjunto de dispositivos conectados, bem como receber dados deles.

A compilação de um conjunto de scripts para uma automatização adequada de teste de desempenho de IU, no mínimo, deve ser capaz de utilizar o MonkeyRunner para realizar as seguintes tarefas:

Triagem e resolução de problemas observados

Quando os padrões ou regressões dos problemas forem identificados, a próxima etapa é identificar e aplicar a resolução. Se a estrutura de teste automatizado preservar o detalhamento preciso para os quadros, ela poderá ajudar na inspeção de alterações de layout/código suspeitos recentes (em caso de regressão) ou reduzir a parte do sistema que você está analisando ao alternar para a investigação manual. Para a investigação manual, systrace é um ótimo lugar para começar, exibindo as informações de precisão sobre cada estágio do pipeline de renderização, cada encadeamento e núcleo no sistema, bem como quaisquer marcadores de evento personalizados definidos.

Geração de perfis adequada de precisões temporais

É importante observar as dificuldades em obter e medir as precisões do desempenho de renderização. Esses números são, por natureza, não determinísticos e frequentemente oscilam dependendo do estado do sistema, da quantidade de memória disponível, da diminuição termal e da última vez em que a luz do sol atingiu a sua área da Terra. Ou seja, é possível executar o mesmo teste duas vezes e receber números levemente diferentes que podem ser muito próximos, mas não idênticos.

A coleta e a geração de perfil de dados nesta maneira significa executar o mesmo teste, várias vezes, e acumular os resultados como uma média ou valor mediano (para a simplicidade, chamemos de "lote"). Isto fornece uma aproximação do desempenho do teste, já que precisões exatas não são necessárias.

Os lotes podem ser usados entre alterações de códigos para verificar o impacto relativo dessas alterações no desempenho. Se a taxa de quadros média para o lote antes da alteração for maior do que o lote após a alteração, então o resultado de desempenho wrt geral será um sucesso para esta alteração em particular.

Isto significa que qualquer teste de IU automatizado feito deve levar este conceito em consideração, bem como quaisquer anomalias que possam ocorrer durante um teste. Por exemplo, se o desempenho do aplicativo repentinamente cair devido a algum problema do dispositivo (que não tenha sido causado pelo aplicativo), então talvez seja necessário executar o lote novamente para obter precisões menos caóticas.

Logo, quantas vezes deve-se realizar um teste antes de as medidas terem algum sentido? 10 vezes deve ser o mínimo, com números altos como 50 ou 10 oferecendo resultados mais precisos (é claro que se deve levar em consideração o tempo para ter mais precisão).