Como aumentar o desempenho do seu aplicativo estilo Metro

Blog do desenvolvedor de aplicativos do Windows 8

Ideias sobre a criação de aplicativos com o estilo Metro para o Windows 8, da equipe de engenharia do Windows 8

Como aumentar o desempenho do seu aplicativo estilo Metro

  • Comments 0

Ninguém gosta de aplicativos lentos ou que parem de responder. Os usuários esperam que os aplicativos respondam imediatamente aos toques, cliques, gestos e pressionamentos de tecla. Esperam também que as animações sejam contínuas, que eles possam executar, pausar e reiniciar músicas e vídeos rapidamente, e que o aplicativo sempre obedeça imediatamente a seus comandos. Esta é a primeira de uma série de postagens sobre como tornar os seus aplicativos "rápidos e fluidos".

Investimos muito tempo nas equipes de engenharia, pensando sobre como poderíamos garantir o desempenho dos aplicativos estilo Metro. Aprendemos o que podemos fazer na plataforma para proporcionar um desempenho rápido e fluido e também o que funciona e o que não funciona na criação de aplicativos que ofereçam ótimas experiências. Nesta postagem, compartilho algumas das duras lições que aprendemos com as nossas próprias experiências, para que você possa criar as melhores experiências possíveis para os seus clientes.

A psicologia do desempenho

O desempenho vai muito além da simples cronometragem e de algoritmos eficientes. Quando penso em desempenho, gosto de ter uma visão holística e considerar como os usuários vivenciam o tempo enquanto usam os aplicativos. O que significa um aplicativo rápido e fluido? Uma forma de refletir sobre isso é dividir as experiências de um usuário em três categorias: percepção, tolerância e capacidade de resposta.

Percepção: Isso está levando um século!

A percepção contribui para o "rápido" do "rápido e fluido". Definimos a percepção de desempenho de um usuário com base na lembrança que ele tem do tempo que o aplicativo levou para realizar tarefas, se é positiva ou não. Em um mundo perfeito, as percepções de um usuário refletiriam a realidade. Mas normalmente não é o que acontece, e a percepção que eles têm do tempo é mais importante do que a realidade. Você já deixou que uma instalação fosse concluída sozinha e, ao retornar, percebeu que ela parou no meio do caminho, aguardando que você respondesse a mais uma pergunta?

Quanto maior o número de etapas que você se lembre em um processo, mas lento ele parece ser.

O que você deve fazer:
  • Reduzir o tempo entre as atividades que o usuário precisa realizar para concluir sua tarefa
  • Sempre que você precisar fazer perguntas ao usuário ou pedir que ele forneça informações, solicitar todas elas juntas no início.
O que você não deve fazer:
  • Separar as atividades do usuário em vários períodos com intervalos de tempo.

Tolerância: O tempo voa quando você está se divertindo

A tolerância contribui para o "rápido" e o "fluido" do "rápido e fluido". Se a percepção é uma medida da lembrança que um usuário tem do tempo que passou, a tolerância é uma medida de como foi a passagem do tempo, se foi positiva ou não.

Quando o usuário não sabe quanto tempo levará uma ação, a espera é penosa. Vamos supor que você esteja usando um aplicativo para fazer algumas edições de fotos. Quando você clica para aplicar um filtro, o aplicativo para de responder. O tempo que ele leva congelado logo se torna intolerável, mesmo que sejam apenas alguns segundos.

Os aplicativos de fotos solucionaram esse problema adicionando uma barra de progresso ou pequena animação para indicar que o filtro está sendo aplicado. O tempo que os usuários esperam aguardar até a conclusão do trabalho é muito maior porque não há incerteza. O aplicativo é rápido e fluido, e a diferença é enorme.

O que você deve fazer:

  • Identificar as áreas do seu aplicativo que necessitem de um tempo de carregamento significativo (> = 1 s).
  • Tomar medidas para limitar ou eliminar a incerteza do usuário durante esses cenários.
  • Fornecer aos usuários uma indicação visual do ponto em que eles estão no processo e quanto tempo ainda falta.
  • Usar APIs assíncronas para evitar o bloqueio da thread da interface do usuário e impedir que o aplicativo pareça estar congelado.

O que você não deve fazer:

  • Submeter o aplicativo a ações de execução demoradas sem dar feedback ao usuário.

Capacidade de resposta: reflexos < reações < confirmações

A capacidade de resposta contribui para o "fluido" do "rápido e fluido". Se a tolerância é uma medida das expectativas e da visão positiva do tempo, a capacidade de resposta é o conceito de que as expectativas em relação ao tempo têm relação com a atividade em execução. Para medir e classificar o desempenho de uma atividade, deve haver um intervalo de tempo para servir de comparação. Chamarei esses intervalos de tempo de classes de interação. Internamente, usamos essas classes de interação para definir as metas de capacidade de resposta dos cenários principais do Windows e acompanhar as falhas no alcance dessas metas como bugs do produto.

Classe de interação

Meta

Limite máximo

Percepção humana

Cenário típico

Instantâneo

< = 50 ms

100 ms

Nenhum atraso perceptível.

Resposta a entradas, como clique do mouse, toque do botão etc.

Rápido

50 – 100 ms

200 ms

Atraso minimamente perceptível. Não é necessário feedback.

Movimento panorâmico/Rolagem

Normal

100 – 300 ms

500 ms

Ágil, mas devagar para ser descrito como rápido. Não é necessário feedback.

Abertura de caixa de diálogo em uma página (isto é, uma dica de informações, pop-up, saída, notificação do sistema etc.)

Com grande capacidade de resposta

300 – 500 ms

1 segundo

Não é rápido, mas com grande capacidade de resposta. Não é necessário feedback.

Navegação para uma nova página, aplicação de zoom, exibição de dados processados ou prontos

Prolongado

> 500 ms

10 segundos

Tempo de espera médio, com pouca capacidade de resposta. Não demorado o suficiente para que se possa fazer outra coisa. Feedback pode ser necessário.

Inicialização do aplicativo, ajuste do aplicativo, mensagens de erro, tempo limite, indicação do progresso da atualização

Estendido

> 5 segundos

> 1 minuto

Demorado o suficiente para se fazer outra coisa durante a espera. Feedback pode ser necessário.

Sincronização ou indexação de dispositivo/biblioteca

O que você deve fazer:

  • Atribuir os cenários importantes do seu aplicativo a uma classe de interação que represente a experiência desejada.
  • Identificar se os seus cenários não estão atingindo essas metas e otimizá-los.
  • Identificar se um cenário precisa fornecer feedback ao usuário e providenciá-lo.

Principais experiências a serem otimizadas

Os problemas de desempenho aparecem de várias maneiras. Eles podem reduzir a vida útil da bateria, retardar o movimento panorâmico e a rolagem em relação aos comandos do usuário ou, até mesmo, fazer com que o aplicativo pareça congelado por um período prolongado. Sei que você não tem todo o tempo do mundo para gastar aumentando o desempenho, portanto, essa seção abordará algumas dicas sobre como identificar áreas em que a otimização terá o maior impacto e algumas diretrizes que podem ajudá-lo a fazer essas otimizações.

Uma maneira de se pensar a respeito das otimizações é que um processo precisa ser 20% mais rápido ou 20% mais lento para que um usuário perceba alguma diferença.

Diagrama mostrando que é perceptível um processo 20% mais rápido ou mais lento do que o tempo atual

Você pode localizar pontos críticos no seu aplicativo que possam aumentar muito o desempenho dos cenários principais. Mas, ao corrigir esses problemas, se torna cada vez mais improvável encontrar um único problema de desempenho cujo processo possa ter sua duração imediatamente reduzida em 20%. É mais comum a acumulação de problemas menores no mesmo caminho que afetam o mesmo problema da experiência do usuário. Na seção a seguir, falarei sobre uma ótima ferramenta para a descoberta desses caminhos.

Criação de perfil do aplicativo

Uma das técnicas mais simples e prontamente disponíveis para determinar onde as otimizações teriam um maior efeito é a criação de perfil do aplicativo. A criação de perfil oferece dados sobre o tempo que o aplicativo gasta em várias funções, para que você possa ver os pontos críticos em que o aplicativo realiza mais trabalho. Felizmente, há uma ótima ferramenta de criação de perfil disponível no Visual Studio 11 que você pode acessar no Windows 8 Consumer Preview.

Mas, antes de começar, lembre-se de que o Windows 8 será executado em uma ampla variedade de dispositivos e as providências tomadas para aumentar o desempenho em um hardware potente podem não ter o mesmo efeito no desempenho de outros fatores forma. Quando faço medições de recursos meus, costumo usar um laptop não avançado. Para obter mais informações, consulte a postagem Executando o Consumer Preview: recomendações de sistema.

Veja como preparar um computador para as medições:

  1. Verifique se o computador está conectado na tomada e não funcionando à bateria. Muitos sistemas funcionam de forma diferente à bateria a fim de economizar energia.
  2. Não use área de trabalho remota para executar as medições porque isso pode desabilitar a aceleração de hardware e distorcer os resultados.
  3. Assegure que a utilização total da memória no sistema seja inferior a 50%. Se estiver acima disso, feche aplicativos até alcançar os 50% para garantir a medição do impacto real do seu aplicativo e não de outros processos.

Para iniciar a criação de perfil do seu aplicativo:

  1. Inicie o aplicativo no Visual Studio.
  2. No menu Depurar, selecione uma das duas opções de análise de desempenho:
  3. Menu contendo [Start Performance Analysis] (Iniciar Análise de Desempenho) (Alt+F2), [Start Performance Analysis Paused] (Iniciar Análise de Desempenho Pausada) (Ctrl+Alt+F2)

    • Start Performance Analysis: inicia imediatamente a gravação das informações de uso e inicia o aplicativo.
    • Start Performance Analysis Paused: inicia o aplicativo, e a gravação das informações pode ser retomada posteriormente. Essa opção é usada para colocar o aplicativo em um estado específico antes da gravação das informações (como testar o cenário de um usuário específico).
  4. Após executar as ações que desejar medir, volte para o Visual Studio e clique em Parar Criação de Perfil. O VS gerará um relatório e exibirá informações essenciais sobre as atividades do aplicativo.

Link Parar criação de perfil no Visual Studio

Dois dos modos de exibição mais úteis do relatório de desempenho são a Árvore de Chamadas e [Function Details] (Detalhes da função). No modo de exibição Árvore de Chamadas, você pode ver todas as funções chamadas pelo seu aplicativo durante a execução, quantas vezes foram invocadas e quanto tempo levaram para ser executadas. Há também um botão [Expand Hot Path] (Expandir Afunilamento), que mostra as funções cuja execução levou mais tempo. Essas são as primeiras áreas em que você deve concentrar as suas otimizações porque elas provavelmente proporcionarão o maior efeito.

Botão Expand Hot Path na exibição Árvore de Chamadas

O relatório mostra os tempos inclusivo e exclusivo de cada função. O tempo exclusivo mede o percentual de tempo gasto na execução de código da função. O tempo inclusivo é o percentual de tempo entre o momento em que a função foi chamada e seu retorno. Em outras palavras, não é apenas o tempo gasto na execução de código na função, mas também o tempo gasto na execução de código de todas as funções chamadas.

Você pode abrir o modo de exibição Function Details de todas as funções do seu aplicativo para obter informações detalhadas sobre o que a função fez, incluindo o código específico que ela executou, quais funções ela chamou e quanto tempo durou essas funções. No exemplo mostrado na figura, a função Array.concat é a que mais contribui para o afunilamento, utilizando 29,7% do tempo de execução do aplicativo. O modo de exibição Function Details nos mostra que a função Array.concat na verdade somente utiliza cerca de 12,6% do tempo (mostrado em laranja) e que a maior parte do tempo é utilizada pela função get_MainResourceMap, que a função de concatenação chama como parte de sua execução (mostrado em roxo). Você pode clicar em qualquer uma dessas funções para obter mais detalhes.

O modo de exibição Function Details da Array.concat mostra o percentual de funções de chamada, o percentual da função atual e os percentuais de funções chamadas.

Algumas semanas antes do lançamento do Windows 8 Consumer Preview, ao usar um dos meus aplicativos, percebi que o meu laptop estava ficando quente e as ventoinhas começaram a ligar. Eu e o proprietário do aplicativo usamos a criação de perfil para identificar e corrigir alguns caminhos de código que estavam causando um enorme uso desnecessário da CPU. A diferença foi imediatamente notada e outros cenários do aplicativo (como o ajuste) também melhoraram com as alterações.

A suspensão é uma grande aliada

A inicialização do aplicativo somente ocorre quando ele não está suspenso. Quando suspenso, o aplicativo é exibido instantaneamente ao ser retomado. Mantê-lo suspenso é uma técnica que gerencia a percepção, a tolerância e a capacidade de resposta. Os usuários usufruem do aplicativo mais rapidamente e nunca passam pela incerteza de ficar aguardando o carregamento toda vez que forem usá-lo. Resumindo, impedir o término do seu aplicativo é uma grande conquista em termos de desempenho. A maneira mais fácil de fazer isso é manter o uso da memória do aplicativo baixo enquanto suspenso.

Antes de o aplicativo ser suspenso, ele tem alguns segundos para realizar alguns trabalhos. Durante esse período, libere objetos grandes que possam ser facilmente retomados depois. Isso mantém o volume de memória baixo e reduz enormemente a probabilidade de o sistema terminar o seu aplicativo para dar espaço para outra coisa. Veja aqui como saber se o seu aplicativo é suspenso de forma correta:

  1. Inicie o aplicativo e volte para a área de trabalho.
  2. Inicie o Gerenciador de Tarefas pressionando Ctrl+Shift+Esc e clicando em “Mais detalhes” para ver todas as opções disponíveis.
  3. Clique em Exibir > [Status values] (Status) > [Show suspended status] (Mostrar status suspenso).

No menu  (Exibir), as opções [Group by type] (Agrupar por tipo) e [Show suspended status] (Mostrar status suspenso) estão selecionadas.

Após alguns segundos, o termo "Suspenso" será exibido ao lado do nome do seu aplicativo. Enquanto estiver suspenso, verifique se o uso da memória no conjunto de trabalho particular do aplicativo está significativamente mais baixo do que quando em execução. Recomendo estes valores como meta de memória para quando o seu aplicativo estiver no estado suspenso, com base em sua complexidade e tamanho geral:

Complexidade do aplicativo (aprox.)

Conjunto particular enquanto suspenso (máx.)

Aplicativo pequeno (exemplo: Hello World)

40 a 60 MB

Aplicativo médio (exemplo: Weather)

60 a 80 MB

Aplicativo grande (exemplo: Windows Live Fotos)

120 a 150 MB

Veja como saber quanta memória o seu aplicativo está usando enquanto suspenso:

  1. Suspenda o aplicativo seguindo as etapas mencionadas acima.
  2. Clique com o botão direito do mouse no nome do aplicativo no Gerenciador de Tarefas e clique em [Go to details] (Ver detalhes). Você verá mais detalhes sobre o processo do seu aplicativo (WWAHost.exe é o processo de todos os aplicativos estilo Metro que usam JavaScript; se o seu aplicativo não usar JavaScript, o nome dele será exibido no processo).
  3. Verifique se a coluna [Memory (private working set)] (Memória (conjunto de trabalho particular)) está presente. Se não estiver, clique com o botão direito em qualquer coluna, vá para Selecionar colunas e selecione Memory (private working set).
  4. A opção Memory (private working set) está selecionada na lista de nomes de colunas

  5. O valor que aparece nessa coluna é o conjunto de trabalho particular do seu aplicativo.


O uso de memória aparece como 20.736 K

Sendo um bom cidadão no ecossistema de aplicativos

Você pode ficar desapontado, mas o seu aplicativo não será o único a ser usado :-). Portanto, o seu aplicativo deve ser um bom cidadão quando executado no sistema do usuário para que a culpa de quaisquer latências observadas no sistema não seja atribuída ao seu aplicativo nem seja feita uma relação entre isso e o mau desempenho ou vida útil da bateria em seu sistema. Veja algumas dicas para ajudar o seu aplicativo a funcionar bem com outros.

Não aumente o uso da memória

O trabalho do sistema é acomodar as necessidades de recursos de todos os aplicativos estilo Metro, terminando automaticamente aplicativos suspensos para dar lugar a novos, o que evita que o usuário tenha de gerenciar recursos. Um efeito colateral disso é que, se um aplicativo solicita um grande volume de memória, os outros aplicativos podem ser terminados – mesmo que o aplicativo libere essa memória logo após tê-la solicitado. Para evitar esse problema ao lidar com operações pesadas, a melhor abordagem é a separação em pequenas partes.

Se você estiver codificando em uma linguagem de gerenciamento de memória (como JavaScript ou C#), é extremamente difícil controlar o momento em que as alocações de memória ocorrem. Entretanto, uma armadilha comum é carregar recursos grandes demais para a resolução do sistema atual e reduzi-los. Você pode usar as novas APIs de miniatura para adquirir recursos adequados à meta de resolução e evitar uma sobrecarga desnecessariamente alta. Usamos essa abordagem para reduzir muito o uso da memória de um jogo de quebra-cabeça que usamos para teste.

Independentemente da linguagem, recomendo estes valores como meta para a memória do tempo de execução do seu aplicativo, com base em sua complexidade e tamanho geral:

Complexidade do aplicativo (aprox.)

Conjunto de trabalho total (máx.)

Aplicativo pequeno (exemplo: Hello World)

50 a 70 MB

Aplicativo médio (exemplo: Weather)

80 a 100 MB

Aplicativo grande (exemplo: Fotos)

120 a 150 MB

Veja como saber a quantidade de memória que o seu aplicativo está usando quando executado:

  1. Inicie o Gerenciador de Tarefas pressionando Ctrl+Shift+Esc e clicando em Mais detalhes para ver todas as opções disponíveis.
  2. Clique no item de menu Opções e verifique se Sempre Visível está marcado.
  3. Inicie o aplicativo. Quando o aplicativo aparecer no Gerenciador de Tarefas, clique com o botão direito do mouse nele e clique em Go to details.
  4. Verifique se a coluna [Working set (memory)] (conjunto de trabalho (memória)) está presente. Se não estiver, clique com o botão direito em qualquer coluna e vá para Selecionar colunas. Marque a coluna Working set (memory).

    Working set (memory) está selecionada na lista de colunas

  5. O valor que aparece nessa coluna é o conjunto de trabalho total do seu aplicativo.

Minimize o uso de recursos de sistema enquanto estiver no modo ocioso ou ajustado

Uma das maiores preocupações dos usuários é a vida útil da bateria de seus dispositivos. Portanto, recomendo que os seus aplicativos estilo Metro ajudem a economizar energia, liberando o uso de recursos de sistema enquanto o usuário não estiver interagindo ativamente com eles. Veja aqui algumas dicas para reduzir o uso de recursos:

Não execute animações, áudio ou vídeos em segundo plano no modo ajustado.

  • O seu aplicativo não é mais o foco da atenção. Torne o seu aplicativo colorido e utilizável, mas não use os recursos disponíveis para o aplicativo principal nem use a bateria.
  • Nesse caso, considera-se que o seu aplicativo não é um cliente de reprodução de música/vídeo dedicado.

Não execute animações, áudio ou vídeos em segundo plano em um loop infinito.

  • Pause essas atividades se o usuário não interagir com o aplicativo após um curto período. Você poderá retomá-las de forma segura quando o usuário voltar a interagir com o seu aplicativo.
  • Já vi reduções de uso da CPU no modo ocioso de 40% para 0% apenas com a pausa das atividades em segundo plano.

Não realize armazenamento em cache de arquivos, sincronização de dispositivo ou qualquer outra operação de uso intensivo do disco nos modos ajustado ou ocioso.

  • O uso desnecessário do disco aumenta os tempos de busca de outras operações e consome muita energia.

A seguir

Nesta postagem, descrevi maneiras de se pensar sobre o desempenho e métodos de definição de metas para as principais experiências do seu aplicativo, e falei sobre algumas ferramentas para ajudar a identificar áreas que talvez devam ser otimizadas. A minha próxima postagem abordará como otimizar as áreas de maior problema e evitar algumas armadilhas comuns. Espero que essas dicas sejam úteis para você!

Até a próxima,

-- David Tepper, gerente de programas, Windows

  • Loading...
Leave a Comment
  • Please add 4 and 7 and type the answer here:
  • Post