Planeie e meça o desempenho da aplicação

Os utilizadores esperam que as suas aplicações se mantenham responsivas, que se sintam naturais e que não esgotem a bateria. Tecnicamente, o desempenho é um requisito não funcional, mas tratar o desempenho como uma funcionalidade ajuda-o a cumprir as expectativas dos seus utilizadores. Especifique objetivos e meça resultados — estes são fatores-chave. Determine os seus cenários críticos de desempenho, defina o que significa bom desempenho e depois meça cedo e frequentemente ao longo do ciclo de vida do seu projeto para ter confiança de que atingirá os seus objetivos.

Especificar objetivos

A experiência do utilizador é uma forma básica de definir um bom desempenho. O tempo de arranque de uma aplicação pode influenciar a perceção do utilizador sobre o seu desempenho. Um utilizador pode considerar um tempo de lançamento de uma aplicação inferior a um segundo como excelente, menos de cinco segundos como bom e superior a cinco segundos como mau.

Outras métricas têm um impacto menos óbvio na experiência do utilizador, como a memória. As hipóteses de uma aplicação ser terminada enquanto está suspensa ou inativa aumentam com a quantidade de memória que a aplicação ativa utiliza. O elevado consumo de memória degrada a experiência de todas as aplicações no sistema, por isso ter um objetivo de consumo de memória é razoável.

Defina objetivos iniciais que sejam específicos e mensuráveis. Devem enquadrar-se em três categorias:

  • Tempo — quanto tempo demoram os utilizadores ou a aplicação a concluir tarefas
  • Fluidez — a velocidade e continuidade com que a aplicação se redesenha em resposta à interação do utilizador
  • Eficiência — quão bem a aplicação poupa recursos do sistema, incluindo a energia da bateria

Time

Pense em intervalos aceitáveis de tempo decorrido (classes de interação) para os utilizadores completarem as suas tarefas.

Classe de interação Perceção do utilizador Ideal Máximo Examples
Rápido Atraso minimamente perceptível 100 ms 200 ms Abre a barra da aplicação; Pressiona um botão (primeira resposta)
Típico Rápido, mas não rápido 300 ms 500 ms Redimensionar; Zoom semântico
Adaptativo Não é rápido, mas parece responsivo 500 ms 1 segundo Navegue para outra página; Retomar a aplicação
Launch Experiência competitiva 1 segundo 3 segundos Inicie a aplicação pela primeira vez
Contínuo Já não parece responsivo 500 ms 5 segundos Descarregue um ficheiro da Internet
Cativo Demorado; o utilizador podia sair daqui 500 ms 10 segundos Instalar várias aplicações a partir da loja

Atribui classes de interação aos cenários de desempenho da tua aplicação. Para cada cenário, atribui a referência no tempo da aplicação, uma parte da experiência do utilizador e uma classe de interação.

Fluidez

Objetivos específicos de fluidez mensuráveis para a sua aplicação podem incluir:

  • Sem redesenhos do ecrã, paradas e partidas (glitches)
  • As animações são renderizadas a 60 fotogramas por segundo (FPS)
  • Quando um utilizador faz uma panorâmica ou desliza, a aplicação apresenta entre 3 a 6 páginas de conteúdo por segundo

Efficiency

Objetivos específicos de eficiência mensuráveis para a sua aplicação podem incluir:

  • A percentagem de CPU da sua aplicação está igual ou abaixo de um valor-alvo e o uso de memória em MB está sempre igual ou abaixo de um alvo
  • Quando a aplicação está inativa, o consumo de CPU e memória é mínimo
  • A sua aplicação pode ser usada ativamente durante um número alvo de horas com bateria

Desenhe a sua aplicação para desempenho

Use os seus objetivos de desempenho para influenciar o design da sua aplicação. Considere estes aspetos:

UI(Interface de Utilizador)

  • Maximize o tempo de análise e carregamento e a eficiência de memória de cada página otimizando a marcação XAML. Adia o carregamento da interface e do código até ser necessário.
  • Para ListView e GridView, faça todos os itens do mesmo tamanho e use o máximo de técnicas de otimização possível.
  • Declare a interface do utilizador em linguagem de marcação em vez de a construir imperativamente no código.
  • Adia a criação dos elementos da interface até que o utilizador precise deles usando o atributo x:Load .
  • Prefiro transições de temas e animações a animações com storyboard. As animações por storyboard requerem atualizações constantes do ecrã e mantêm o processador e o pipeline gráfico ativos.
  • Carregue as imagens num tamanho apropriado para a vista em que as apresenta.

CPU, memória e alimentação

  • Programar tarefas de menor prioridade em threads de menor prioridade. Ver Programação assíncrona e a classe DispatcherQueue .
  • Minimize o consumo de memória da sua aplicação libertando recursos caros (como multimédia) quando não forem necessários.
  • Evite fugas de memória desregistando os gestores de eventos e desreferenciando elementos da interface sempre que possível.
  • Para otimizar a autonomia da bateria, seja moderado na frequência com que sonda dados, interroga um sensor ou agenda tarefas para o CPU quando este está inativo.

Acesso aos dados

  • Se possível, pré-carregue o conteúdo.
  • Armazene em cache o conteúdo cujo acesso é dispendioso.
  • Para falhas de cache, mostre uma interface provisória o mais rapidamente possível que indique que a aplicação ainda está a carregar conteúdo.

Ferramenta de desempenho

À medida que programas, adiciona código que regista mensagens e eventos em certos momentos enquanto a tua aplicação está a correr. Mais tarde, utilize ferramentas de perfilagem como Windows o Performance Recorder e Windows Analisador de Desempenho (ambas incluídas no Windows Performance Toolkit) para criar e visualizar um relatório sobre o desempenho da sua aplicação.

O Windows fornece APIs de registo apoiadas pelo Event Tracing for Windows (ETW) que oferecem uma solução rica de registo e rastreamento de eventos. As APIs no espaço de nomes Windows.Foundation.Diagnostics incluem as classes FileLoggingSession, LoggingActivity, LoggingChannel e LoggingSession.

// using Windows.Foundation.Diagnostics;

LoggingChannel myLoggingChannel = new LoggingChannel("MyLoggingChannel");
myLoggingChannel.LogMessage("Here's my logged message.", LoggingLevel.Information);

Para registar eventos de início e paragem ao longo de um período de tempo:

LoggingChannel myLoggingChannel = new LoggingChannel("MyLoggingChannel");
LoggingActivity myLoggingActivity;

using (myLoggingActivity = new LoggingActivity("MyLoggingActivity", myLoggingChannel))
{
    // A start event is logged when the activity begins.
    // Add code here to do something of interest.
}
// An end event is logged when the activity ends.

Testar e medir em relação aos objetivos de desempenho

Use estas técnicas e ferramentas para testar como a sua aplicação se compara com os seus objetivos de desempenho:

  • Teste contra uma grande variedade de configurações de hardware, incluindo desktops, portáteis, ultrabooks e tablets.
  • Teste em uma vasta gama de tamanhos de ecrã. Ecrãs mais largos mostram mais conteúdo, o que pode afetar negativamente o desempenho.
  • Elimine o maior número possível de variáveis de teste:
    • Desligue as aplicações em segundo plano no dispositivo de teste.
    • Constrói a tua aplicação na configuração de Release antes de a implementares no dispositivo de teste.
    • Execute a aplicação várias vezes para ajudar a eliminar variáveis de teste aleatórias e garantir medições consistentes.
  • Teste de disponibilidade reduzida de energia. Os dispositivos dos utilizadores podem ter significativamente menos energia do que a sua máquina de desenvolvimento.
  • Use uma combinação de ferramentas como Visual Studio e Windows Analisador de Desempenho para medir o desempenho da aplicação.

Responder aos resultados dos testes de desempenho

Depois de analisar os resultados dos seus testes de desempenho, determine se são necessárias alterações:

  • Deves mudar as decisões de design da tua aplicação ou otimizar o teu código?
  • Deves adicionar, remover ou alterar a instrumentação no código?
  • Deves rever os teus objetivos de desempenho?

Se forem necessárias alterações, faça-as e volte à instrumentação ou testes.

Optimize

Otimize apenas os caminhos de código críticos de desempenho na sua aplicação — aqueles onde é mais tempo gasto. O perfilamento indica-lhe quais são estas áreas. Muitas vezes, há um compromisso entre boas práticas de conceção e código com o mais alto nível de otimização. Priorize a produtividade dos programadores e um bom design de software em áreas onde o desempenho não seja uma preocupação.