Recentemente, estava visitando uma empresa parceira que está migrando para o Windows Azure um sistema muito interessante de distribuição de vídeos sob demanda e ao vivo.

Meu foco lá era ajudar a migração para o Windows Azure e apoiar o desenvolvimento do cliente de vídeo para Windows 8. No entanto, o desenvolvedor do aplicativo de Windows 8 estava super ocupado tentando identificar um problema de desempenho no cliente de vídeo para Silverlight.

Após verificar o uso de boas práticas de desempenho do Silverlight como habilitar aceleração via hardware e uso de bitmap cache, o problema ainda persistia, e foi então que apresentei as ferramentas de análise de desempenho do Visual Studio.

É muito comum os desenvolvedores utilizarem o Visual Studio Ultimate, Premium e Professional e não conhecerem o poder da ferramenta que eles tem nas mãos.

Neste post, veremos 4 ferramentas de análise de desempenho que estão disponíveis a partir da edição Professional do Visual Studio.

Essas ferramentas te ajudarão a:

  1. Criar Sessões de Profiling para realizar a análise de desempenho;
  2. Identificar gargalos (chamadas e métodos que mais consomem CPU, ou que bloqueiam recursos de outras threads) e consumo de memória, mostrando exatamente quais linhas de código são responsáveis pela “lentidão” da aplicação.

As ferramentas:

  • Performance Explorer: Janela que exibe as Sessões de Profiling (Profiling Session), com seus respectivos Relatórios (Reports) e Executáveis (Targets). Para acessar essa janela, vá ao menu ANALYSE | WINDOWS | PERFORMANCE EXPLORER.

 

  • Performance Wizard: Assistente para criar Sessões de Profiling (Profiling Session), escolhendo o método de Profiling e os executáveis ou websites (Targets). Acessado através do menu ANALYSE | LAUNCH PERFORMANCE WIZARD...
  • Profiler: Ferramenta que roda suas aplicações (Targets) e faz o monitoramento dos métodos que estão sendo executados, podendo acompanhar o tempo de CPU e quantidade de memória que cada método está utilizando, gerando o Relatório de Profiling. Acessado através do menu ANALYSE | START PERFORMANCE ANALYSIS, ou ANALYSE | PROFILER ou pela janela Performance Explorer.
  • Relatório de Profiling: Janela para visualizar os relatórios de Profiling e identificar os gargalos da sua aplicação. Acessado pela janela Performance Explorer.
 

 

Como o Profiler funciona?

Antes de seguirmos em frente sobre como utilizar o Profiler, vamos primeiro entender como ele funciona.

Não tem mágica, o Profiler é um programa que atua como um Debugger e que monitora o seu aplicativo, analisando os métodos que estão em execução, a quantidade de memória utilizada e até mesmo as threads e como elas concorrem entre si por recursos comuns.

Como o Profiler também é um programa, e para monitorar o seu aplicativo ele precisa muitas vezes suspender a execução do seu aplicativo para “tirar uma foto” do que seu aplicativo está fazendo, muitas vezes ele impacta negativamente na execução do seu aplicativo no momento da análise. Por isso, não se preocupe exatamente com o tempo de execução. Por exemplo, se antes um método que demorava 2 segundos para executar e agora com o Profiler leva 3 segundos.

O importante é que o Profiler te ajudará a identificar, de maneira relativa, quais métodos levam o maior tempo ou consomem mais memória.

 

Como usar o Profiler para identificar gargalos e otimizar sua aplicação?

  1. Inicie o Performance Wizard pelo menu ANALYSE | LAUNCH PERFORMANCE WIZARD...
  2. Escolha o métodoa ser utilizado:
    • CPU Sampling (recommended): De tempos em tempos (ordem de milissegundos), verifica qual método está em execução e qual caminho de código (Stack Trace) foi utilizado para chegar nele. Este método tem o menor impacto na execução do seu aplicativo, mas é menos preciso que a instrumentação.
    • Instrumentation: Coleta informações detalhadas sobre a execução de cada método. Ele consegue medir com maior precisão o tempo de execução de cada método, mas no geral seu aplicativo ficará um pouco mais lento pois a instrumentação é executada antes e depois da execução de cada método.
    • .NET memory allocation (sampling): A cada alocação de um objeto .NET ou coleta do garbage collection, ele monitora o quanto foi alocado/liberado e qual código foi executado para isso acontecer.
    • Resource contention data (concurrency): Coleta informações detalhadas sobre a execução de cada thread e como elas compartilham/concorrem por recursos comuns, trabalhando em paralelo ou se bloqueando.
  3. Inicie o Profiling
    • A sua aplicação executará como se ela tivesse sendo debugada. 
    • Utilize ela normalmente utilizando de preferência um plano de testes que possa ser repetido numa próxima execução do Profiler. Isso é importante para garantir que, ao identificar gargalos e otimizar seu código, você possa executar exatamente o mesmo teste para identificar se o problema foi resolvido ou não. É possível automatizar a execução do teste também, mas isso é assunto para outro post.
  4. Analise o relatório
    • O relatório oferece informações bastante completas sobre o desempenho da sua aplicação, identificando os métodos mais executados, os mais demorados, os que mais consomem memória e etc. Tudo isso com uma forte rastreabilidade para o código-fonte daquele método.
  5. Otimize sua aplicação
  6. Rode o mesmo teste novamente

 

Exemplo de análise de relatório

Depois rodei o Profiler e abri o relatório, vejo primeiramente o resumo (Summary) que contém um gráfico de uso de CPU (pois escolhi o método CPU Sampling), onde posso filtrar ou dar zoom num determinado período:

 

E o "caminho quente", que indica quais métodos são responsáveis pela maior parte do uso do processador.

Detalhe: para alguns tipos de aplicações, o caminho quente pode não apontar exatamente onde está o gargalo, mas se você for pesquisando o que é executado dentro do caminho quente, certamente você encontrará a causa-raiz do problema.

E as funções/métodos que tomam o maior tempo da CPU. Novamente, os métodos vilões podem não ser necessariamente os que aparecem aqui, mas sim os métodos que chamam esses aqui.

E se você quiser, também pode ir direto para outras visualizações do relatório.

 

 

No meu caso, eu quis vasculhar o terceiro método que aparece seção "Functions With Most Individual Work".

Ao clicar nele, consigo ver mais detalhes como quais funções mais fazer chamadas para ele.

Como esse método é do .NET framework, não há nada que eu possa otimizar no .NET, mas com certeza posso melhorar o meu código que faz chamada a esse método.

 

E ao investigar o meu método "OnSelectFolderAndFilesCommand", consigo ver o código e identificar o problema (observação em vermelho). 

 

 

Bom, isso é só uma pontinha do iceberg de ferramentas de teste e desempenho que o Visual Studio tem, mas com certeza irá te ajudar a otimizar suas aplicações, ou impressionar o seu chefe com a sua agilidade de identificar e resolver problemas de desempenho.

Vitor Ciaramella

PS: Se você também tiver interesse sobre Gestão de Projetos, Game Design, Windows 8, Windows Phone e Windows Azure, acompanhe meu blog em http://vic.ms.