Partilhar via


Planeamento do desempenho

Os utilizadores esperam que as suas aplicações permaneçam responsivas, se sintam naturais e não esgotem a bateria. Tecnicamente, o desempenho é um requisito não funcional, mas tratar o desempenho como um recurso ajudará você a atender às expectativas dos usuários. Especificar metas e medir são fatores-chave. Determinar quais são os cenários críticos de desempenho; Defina o que significa bom desempenho. Em seguida, meça com antecedência e com frequência suficiente ao longo do ciclo de vida do seu projeto para ter certeza de que atingirá suas metas.

Especificando metas

A experiência do usuário é uma maneira básica de definir um bom desempenho. O tempo de inicialização de um aplicativo pode influenciar a perceção do usuário sobre seu desempenho. Um usuário pode considerar um tempo de inicialização do aplicativo de menos de um segundo excelente, menos de 5 segundos bom e maior que 5 segundos ruim.

Outras métricas têm um impacto menos óbvio na experiência do usuário, por exemplo, a memória. As chances de um aplicativo ser encerrado enquanto suspenso ou inativo aumentam com a quantidade de memória usada pelo aplicativo ativo. É uma regra geral que o alto uso de memória degrada a experiência de todos os aplicativos no sistema, portanto, ter um objetivo sobre o consumo de memória é razoável. Leve em consideração o tamanho aproximado do seu aplicativo conforme percebido pelos usuários: pequeno, médio ou grande. As expectativas em torno do desempenho estarão correlacionadas com essa perceção. Por exemplo, você pode querer que um aplicativo pequeno que não use muita mídia consuma menos de 100 MB de memória.

É melhor definir uma meta inicial, e depois revisá-la mais tarde, do que não ter uma meta. As metas de desempenho do seu aplicativo devem ser específicas e mensuráveis e devem se enquadrar em três categorias: quanto tempo os usuários, ou o aplicativo, levam para concluir tarefas (tempo); a velocidade e a continuidade com que a aplicação se redesenha em resposta à interação do utilizador (fluidez); e quão bem o aplicativo conserva os recursos do sistema, incluindo a energia da bateria (eficiência).

Tempo / Hora

Pense nos intervalos aceitáveis de tempo decorrido (classes de interação) necessários para que os usuários concluam suas tarefas em seu aplicativo. Para cada classe de interação, atribua um rótulo, um sentimento percebido do usuário e durações ideais e máximas. Aqui ficam algumas sugestões.

Rótulo da classe de interação Perceção do utilizador Ideal Máximo Exemplos
Rápido Atraso minimamente percetível 100 milissegundos 200 milissegundos Abra a barra de aplicativos; Pressione um botão (primeira resposta)
Típico Rápido, mas não rápido 300 milissegundos 500 milissegundos Redimensionamento; zoom semântico
Responsivo Não é rápido, mas é sensível ao toque 500 milissegundos 1 segundo Navegue para uma página diferente; Retomar o aplicativo de um estado suspenso
Lançamento Experiência competitiva 1 segundo 3 segundos Inicie o aplicativo pela primeira vez ou depois que ele tiver sido encerrado anteriormente
Contínuo Não se sente mais responsivo 500 milissegundos 5 segundos Baixar um arquivo da Internet
Cativo Longo; usuário pode mudar 500 milissegundos 10 segundos Instalar várias aplicações a partir da Loja

 

Agora você pode atribuir classes de interação aos cenários de desempenho do seu aplicativo. Você pode atribuir a referência point-in-time do aplicativo, uma parte da experiência do usuário e uma classe de interação a cada cenário. Aqui estão algumas sugestões para um exemplo de aplicativo de comida e jantar.

CenárioPonto temporalExperiência do utilizadorClasse de interação
Navegue até a página de receitas Primeira respostaAnimação de transição de página iniciadaRápido (100-200 milissegundos)
ResponsivoLista de ingredientes carregada; sem imagensResponsivo (500 milissegundos - 1 segundo)
Completamente visívelTodo o conteúdo carregado; imagens mostradasContínuo (500 milissegundos - 5 segundos)
Procurar receitaPrimeira respostaBotão de pesquisa clicadoRápido (100 - 200 milissegundos)
Completamente visívelLista de títulos de receitas locais mostradosTípico (300 - 500 milissegundos)

Se você estiver exibindo conteúdo ao vivo, considere também as metas de atualização do conteúdo. O objetivo é atualizar o conteúdo a cada poucos segundos? Ou atualizar o conteúdo a cada poucos minutos, a cada poucas horas ou até mesmo uma vez por dia é uma experiência de usuário aceitável?

Com suas metas especificadas, agora você é mais capaz de testar, analisar e otimizar seu aplicativo.

Fluidez

As metas de fluidez mensuráveis específicas para seu aplicativo podem incluir:

  • Sem interrupções (falhas) no redesenho da tela.
  • As animações são renderizadas a 60 quadros por segundo (FPS).
  • Quando um usuário faz movimento panorâmico/rolagem, o aplicativo apresenta de 3 a 6 páginas de conteúdo por segundo.

Eficiência

As metas de eficiência mensuráveis específicas para seu aplicativo podem incluir:

  • Para o processo do seu aplicativo, a porcentagem de CPU é igual ou inferior a N e o uso de memória em MB é igual ou inferior a M em todos os momentos.
  • Quando o aplicativo está inativo, N e M são zero para o processo do seu aplicativo.
  • A sua aplicação pode ser utilizada ativamente por X horas com energia da bateria; quando a aplicação está inativa, o dispositivo mantém a sua carga por Y horas.

Projete seu aplicativo para desempenho

Agora você pode usar suas metas de desempenho para influenciar o design do seu aplicativo. Usando o aplicativo de comida e jantar de exemplo, depois que o usuário navega para a página de receita, você pode optar por atualizar itens incrementalmente para que o nome da receita seja renderizado primeiro, a exibição dos ingredientes seja adiada e a exibição de imagens seja adiada ainda mais. Isso mantém a capacidade de resposta e uma interface do usuário fluida durante o movimento panorâmico/rolagem, com a renderização de fidelidade total ocorrendo depois que a interação diminui a um ritmo que permite que o thread da interface do usuário se atualize. Aqui estão alguns outros aspetos a considerar.

Interface do usuário

  • Maximize o tempo de análise e carregamento e a eficiência de memória para cada página da interface do usuário do seu aplicativo (especialmente a página inicial) otimizando sua marcação XAML. Em resumo, adie o carregamento da interface do usuário e do código até que seja necessário.
  • Para ListView e GridView, torne todos os itens do mesmo tamanho e use o maior número possível de técnicas de otimização ListView e GridView .
  • Declare a interface do usuário na forma de marcação, que a estrutura pode carregar e reutilizar em partes, em vez de construí-la imperativamente no código.
  • Adie a criação de elementos da interface de utilizador até que o utilizador precise deles. Consulte o atributo x:Load .
  • Prefira transições de tema e animações a animações com storyboard. Para saber mais, veja Visão geral de animações. Lembre-se de que as animações com storyboard exigem atualizações constantes na tela e mantêm a CPU e o processo gráfico ativos. Para preservar a bateria, não tenha animações em execução se o usuário não estiver interagindo com o aplicativo.
  • As imagens carregadas devem ser carregadas em um tamanho apropriado para a exibição na qual você as está apresentando, usando o método GetThumbnailAsync .

CPU, memória e energia

  • Agende tarefas de baixa prioridade para serem executadas em threads e/ou núcleos de menor prioridade. Consulte programação assíncrona, a propriedade Dispatcher, e a classe CoreDispatcher.
  • Minimize o espaço de memória da sua aplicação ao liberar recursos dispendiosos (como mídias) quando suspensa.
  • Minimize o conjunto de trabalho do seu código.
  • Evite vazamentos de memória cancelando o registro de manipuladores de eventos e desreferenciando elementos da interface do usuário sempre que possível.
  • Para o bem da bateria, seja conservador com a frequência com que você pesquisa dados, consulta um sensor ou agenda o trabalho na CPU quando ela está ociosa.

Acesso aos dados

  • Se possível, pré-carregar conteúdo. Para a pré-busca automática, consulte a classe ContentPrefetcher. Para obter a pré-busca manual, consulte o namespace Windows.ApplicationModel.Background e a classe MaintenanceTrigger.
  • Se possível, armazene em cache o conteúdo que é caro de acessar. Consulte as propriedades LocalFolder e LocalSettings.
  • Para falhas de cache, mostre o mais rapidamente possível uma interface temporária que indique que o aplicativo ainda está a carregar conteúdo. Faça a transição do espaço reservado para o conteúdo ao vivo de uma forma que não seja confusa para o usuário. Por exemplo, não altere a posição do conteúdo sob o dedo ou o ponteiro do mouse do usuário enquanto o aplicativo carrega conteúdo ao vivo.

Lançamento e retoma da aplicação

Interface de Utilizador Adaptável e orientação

  • Use a classe VisualStateManager.
  • Conclua apenas o trabalho necessário imediatamente, adiando o trabalho intensivo do aplicativo para mais tarde — o seu aplicativo tem entre 200 e 800 milissegundos para concluir o trabalho antes que o utilizador veja a interface do aplicativo de forma cortada.

Com seus designs relacionados ao desempenho, você pode começar a codificar seu aplicativo.

Instrumento para o desempenho

À medida que você codifica, adicione código que registra mensagens e eventos em determinados pontos enquanto seu aplicativo é executado. Mais tarde, ao testar seu aplicativo, você poderá usar ferramentas de criação de perfil, como o Gravador de Desempenho do Windows e o Analisador de Desempenho do Windows (ambos incluídos no Kit de Ferramentas de Desempenho do Windows) para criar e exibir um relatório sobre o desempenho do seu aplicativo. Neste relatório, você pode procurar essas mensagens e eventos para ajudá-lo a analisar mais facilmente os resultados do relatório.

A Plataforma Universal do Windows (UWP) fornece APIs de registo de eventos, apoiadas por de Rastreamento de Eventos para Windows (ETW), que, juntas, oferecem uma solução avançada de registo e rastreamento de eventos. As APIs, que fazem parte do namespace Windows.Foundation.Diagnostics , incluem as classes FileLoggingSession, LoggingActivity, LoggingChannel e LoggingSession .

Para registar uma mensagem no relatório num ponto específico enquanto o aplicativo está em execução, crie um objeto LoggingChannel e chame o método LogMessage do objeto, assim.

// using Windows.Foundation.Diagnostics;
// ...

LoggingChannel myLoggingChannel = new LoggingChannel("MyLoggingChannel");

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

// ...

Para registrar eventos de início e parada no relatório durante um período de tempo enquanto o aplicativo está em execução, crie um objeto LoggingActivity e, em seguida, chame o construtor LoggingActivity do objeto, desta forma.

// using Windows.Foundation.Diagnostics;
// ...

LoggingActivity myLoggingActivity;

// myLoggingChannel is defined and initialized in the previous code example.
using (myLoggingActivity = new LoggingActivity("MyLoggingActivity"), myLoggingChannel))
{   // After this logging activity starts, a start event is logged.
    
    // Add code here to do something of interest.
    
}   // After this logging activity ends, an end event is logged.

// ...

Consulte também o exemplo de registro em log .

Com seu aplicativo instrumentado, você pode testar e medir o desempenho do aplicativo.

Teste e meça em relação às metas de desempenho

Parte do seu plano de desempenho é definir os pontos durante o desenvolvimento onde você medirá o desempenho. Isso serve a diferentes propósitos, dependendo se você está medindo durante a prototipagem, desenvolvimento ou implantação. Medir o desempenho durante os estágios iniciais da prototipagem pode ser extremamente valioso, por isso recomendamos que você faça isso assim que tiver um código que faça um trabalho significativo. As medições iniciais dão uma boa ideia de onde estão os custos importantes em seu aplicativo e informam as decisões de projeto. Isso resulta em aplicativos de alto desempenho e escalabilidade. Geralmente, é mais dispendioso alterar os designs mais tarde do que antes. Medir o desempenho no final do ciclo do produto pode resultar em hacks de última hora e baixo desempenho.

Use essas técnicas e ferramentas para testar como seu aplicativo se compara às suas metas de desempenho originais.

  • Teste com uma grande variedade de configurações de hardware, incluindo PCs tudo-em-um e desktop, laptops, ultrabooks, tablets e outros dispositivos móveis.
  • Teste em relação a uma grande variedade de tamanhos de ecrã. Embora tamanhos de tela maiores possam mostrar muito mais conteúdo, trazer todo esse conteúdo extra pode afetar negativamente o desempenho.
  • Elimine o maior número possível de variáveis de teste.
    • Desative os aplicativos em segundo plano no dispositivo de teste. Para fazer isso, no Windows, selecione Configurações a partir do menu Iniciar >Personalização>Ecrã de bloqueio. Selecione cada aplicativo ativo e selecione Nenhum.
    • Compile a sua aplicação para código nativo, compilando-a em configuração de lançamento antes de a implantar no dispositivo de teste.
    • Para garantir que a manutenção automática não afete o desempenho do dispositivo de teste, acione-o manualmente e aguarde sua conclusão. No Windows, no menu Iniciar, procure por Segurança e Manutenção. Na área de Manutenção, em Manutenção Automática , selecione Iniciar manutenção e aguarde que o estado mude de Manutenção em progresso.
    • Execute o aplicativo várias vezes para ajudar a eliminar variáveis de teste aleatórias e ajudar a garantir medições consistentes.
  • Teste de disponibilidade de energia reduzida. O dispositivo dos usuários pode ter significativamente menos energia do que a máquina de desenvolvimento. O Windows foi projetado com dispositivos de baixo consumo de energia, como dispositivos móveis, em mente. Os aplicativos executados na plataforma devem garantir um bom desempenho nesses dispositivos. Como heurística, espere que um dispositivo de baixo consumo funcione a cerca de um quarto da velocidade de um computador desktop e defina seus objetivos de acordo.
  • Use uma combinação de ferramentas como o Microsoft Visual Studio e o Windows Performance Analyzer para medir o desempenho do aplicativo. O Visual Studio foi projetado para fornecer análise focada no aplicativo, como vinculação de código-fonte. O Analisador de Desempenho do Windows foi projetado para fornecer análise focada no sistema, como fornecer informações do sistema, informações sobre eventos de manipulação de toque e informações sobre o custo de entrada/saída (E/S) e unidade de processamento gráfico (GPU) do disco. Ambas as ferramentas fornecem captura e exportação de vestígios e podem reabrir rastreamentos compartilhados e post-mortem.
  • Antes de enviar o seu aplicativo à Loja para certificação, certifique-se de incorporar nos seus planos de teste os casos de teste relacionados ao desempenho, conforme descrito na seção "Testes de desempenho" de de testes do Kit de Certificação de Aplicativos Windows e na seção "Desempenho e estabilidade" de casos de teste de aplicativo UWP.

Para obter mais informações, consulte estes recursos e ferramentas de criação de perfil.

Responder aos resultados do teste de desempenho

Depois de analisar os resultados do teste de desempenho, determine se são necessárias alterações, por exemplo:

  • Você deve alterar alguma das decisões de design do aplicativo ou otimizar o código?
  • Você deve adicionar, remover ou alterar qualquer instrumentação no código?
  • Deve rever algum dos seus objetivos de desempenho?

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

Otimização

Otimize apenas os caminhos de código críticos de desempenho em seu aplicativo: aqueles em que a maior parte do tempo é gasto. A análise de perfis lhe dirá quais. Muitas vezes, há um trade-off entre a criação de software que segue boas práticas de design e a escrita de código com o desempenho mais alto de otimização. Geralmente, é melhor priorizar a produtividade do desenvolvedor e um bom design de software em áreas onde o desempenho não é uma preocupação.