Medir o desempenho do aplicativo analisando o uso da CPU (C#, Visual Basic, C++, F#)

Encontre problemas de desempenho durante a depuração com a ferramenta de diagnóstico Uso da CPU integrada ao depurador. Você também pode analisar o uso da CPU sem um depurador anexado ou definindo como destino um aplicativo em execução. Para obter mais informações, confira Executar ferramentas de criação de perfil com ou sem o depurador.

Quando o depurador pausa, a ferramenta Uso da CPU na janela Ferramentas de Diagnóstico coleta informações sobre as funções que estão em execução no aplicativo. A ferramenta lista as funções que estavam executando o trabalho e fornece um gráfico de linha do tempo que você pode usar para se concentrar em segmentos específicos da sessão de amostragem.

Importante

As Ferramentas de Diagnóstico integradas ao depurador têm suporte para desenvolvimento de .NET no Visual Studio, incluindo ASP.NET, ASP.NET Core e desenvolvimento nativo/C++. A carga de trabalho do Visual Studio correspondente é necessária. O Windows 8 ou posterior é necessário para executar ferramentas de criação de perfil com o depurador (janela Ferramentas de Diagnóstico).

Neste tutorial, você irá:

  • Coletar dados de uso da CPU
  • Analisar os dados de uso da CPU

Se Uso da CPU não fornece os dados necessários, outras ferramentas de criação de perfil no Criador de Perfil de Desempenho fornecem diferentes tipos de informações que poderão ser úteis. Em muitos casos, o gargalo de desempenho do aplicativo pode ser causado por algo que não seja a CPU, como memória, interface do usuário de renderização ou tempo de solicitação de rede.

Etapa 1: coletar dados de uso da CPU

  1. Abra o projeto que deseja depurar no Visual Studio e defina um ponto de interrupção no aplicativo no ponto em que deseja examinar o uso da CPU.

  2. Defina um segundo ponto de interrupção no final da função ou da região do código que deseja analisar.

    Definindo dois pontos de interrupção, você pode limitar a coleta de dados às partes do código que deseja analisar.

  3. A janela Ferramentas de Diagnóstico é exibida automaticamente, a menos que tenha sido desativada. Para abrir a janela novamente, clique em Depurar>Windows>Mostrar Ferramentas de Diagnóstico.

  4. Você pode optar por ver Uso de CPU e/ou Uso de Memória, com a configuração Selecionar Ferramentas na barra de ferramentas. Se você estiver executando o Visual Studio Enterprise, também poderá habilitar ou desabilitar o IntelliTrace em Ferramentas>Opções>IntelliTrace.

    Screenshot that shows Diagnostics Tools.

    Screenshot that shows Diagnostics Tools.

    Vamos observar principalmente a utilização da CPU, portanto verifique se Uso de CPU está habilitado (é habilitado por padrão).

  5. Clique em Depurar>Iniciar Depuração (ou em Iniciar na barra de ferramentas ou em F5).

    Quando o aplicativo terminar de ser carregado, a exibição Resumo das Ferramentas de Diagnóstico será exibida. Se você precisar abrir a janela, clique em Depurar>Windows>Mostrar Ferramentas de Diagnóstico.

    Screenshot that shows Diagnostics Tools Summary Tab.

    Screenshot that shows Diagnostics Tools Summary Tab.

    Para obter mais informações sobre os eventos, confira Searching and filtering the Events tab of the Diagnostic Tools window (Pesquisando e filtrando a guia Eventos da janela Ferramentas de Diagnóstico).

  6. Execute o cenário que fará com que o primeiro ponto de interrupção seja atingido.

  7. Enquanto o depurador estiver em pausa, habilite a coleta dos dados de Uso da CPU e, em seguida, abra a guia Uso da CPU.

    Screenshot that shows Diagnostics Tools enable CPU profiling.

    Screenshot that shows Diagnostics Tools enable CPU profiling.

    Quando você escolher Registrar perfil de CPU, o Visual Studio começará a registrar suas funções e quanto tempo elas levam para ser executadas. Você somente poderá exibir esses dados coletados quando o aplicativo for parado em um ponto de interrupção.

  8. Pressione F5 para executar o aplicativo até o segundo ponto de interrupção.

    Agora, você tem dados de desempenho do aplicativo especificamente para a região do código que é executada entre os dois pontos de interrupção.

    O criador de perfil começa a preparar os dados de thread. Aguarde sua conclusão.

    Screenshot that shows Diagnostics Tools preparing threads.

    Screenshot that shows Diagnostics Tools preparing threads.

    A ferramenta de Uso de CPU exibe o relatório na guia Uso da CPU.

    Screenshot that shows Diagnostics Tools CPU Usage Tab.

    Screenshot that shows Diagnostics Tools CPU Usage Tab.

  9. Se você quiser selecionar uma região de código mais específica para analisar, selecione uma região na linha do tempo da CPU (deve ser uma região que mostre dados de criação de perfil).

    Screenshot that shows Diagnostics Tools selecting a time segment.

    Screenshot that shows Diagnostics Tools selecting a time segment.

    Neste ponto, você pode começar a analisar os dados. Se você tiver problemas para coletar ou exibir dados, confira Solucionar erros de criação de perfil e corrigir problemas.

    Dica

    Ao tentar identificar problemas de desempenho, faça várias medidas. O desempenho varia naturalmente de execução para execução, e os caminhos de código normalmente são executados mais lentamente na primeira vez em que são executados devido ao trabalho de inicialização única, como carregar DLLs, métodos de compilação JIT e inicializar caches. Ao fazer várias medidas, você tem uma ideia melhor do intervalo e da mediana da métrica que está sendo mostrada, o que permite comparar o desempenho da primeira vez com o de estado estável de uma área de código.

Etapa 2: Analisar os dados de uso de CPU

Recomendamos que você comece a analisar os dados examinando a lista de funções em Uso da CPU, identificando as funções que fazem a maior parte do trabalho e, em seguida, fazendo uma análise mais detalhada de cada uma.

  1. Na lista de funções, examine as funções que fazem a maior parte do trabalho.

    Screenshot that shows Diagnostics Tools CPU Usage Function List.

    Screenshot that shows Diagnostics Tools CPU Usage Function List.

    Dica

    As funções são listadas em ordem, começando com as que fazem a maior parte do trabalho (elas não ficam na ordem de chamada). Isso ajuda a identificar rapidamente as funções com execução mais longa.

  2. Na lista de funções, clique duas vezes em uma das funções do aplicativo que está trabalhando muito.

    Quando você clica duas vezes em uma função, a exibição Funções é aberta no painel esquerdo. Selecione o modo de exibição Chamador/Receptor no menu suspenso.

    Screenshot that shows Diagnostics Tools Caller Callee View.

    Nesta exibição, a função selecionada aparece no título e na caixa Função Atual (DoWork, neste exemplo). A função que chamou a função atual é mostrada à esquerda em Funções Chamadoras e todas as funções chamadas pela função atual são mostradas na caixa Funções Chamadas à direita. (Você pode selecionar cada uma das caixas para alterar a função atual.)

    Essa exibição mostra o tempo total (ms) e o percentual do tempo de execução geral do aplicativo que a função levou para ser concluída. Corpo da Função também mostra a quantidade total de tempo (e o percentual de tempo) gasta no corpo da função, excluindo o tempo gasto nas funções chamadoras e chamadas.

    Quando você clica duas vezes em uma função, a exibição Chamador/Computador Chamado é aberta no painel esquerdo.

    Screenshot that shows Diagnostics Tools Caller Callee View.

    Nesta exibição, a função selecionada aparece no título e na caixa Função Atual (GetNumber, neste exemplo). A função que chamou a função atual é mostrada à esquerda em Funções Chamadoras e todas as funções chamadas pela função atual são mostradas na caixa Funções Chamadas à direita. (Você pode selecionar cada uma das caixas para alterar a função atual.)

    Essa exibição mostra o tempo total (ms) e o percentual do tempo de execução geral do aplicativo que a função levou para ser concluída. Corpo da Função também mostra a quantidade total de tempo (e o percentual de tempo) gasta no corpo da função, excluindo o tempo gasto nas funções chamadoras e chamadas. (Neste exemplo, 2367 de 2389 ms foram gastos no corpo da função e os 22 ms restantes foram gastos em código externo chamado por essa função).

    Dica

    Valores altos em Corpo da Função podem indicar um gargalo de desempenho dentro da própria função.

  3. Para ver uma exibição de nível superior mostrando a ordem em que as funções são chamadas, selecione Árvore de Chamadas na lista suspensa, na parte superior do painel.

    Cada área enumerada na figura está relacionada a uma etapa do procedimento.

    Diagnostics Tools Call Tree

    Imagem Descrição
    Step 1 O nó de nível superior nas árvores de chamada de uso da CPU é um pseudo-nó
    Step 2 Na maioria dos aplicativos, quando a opção Mostrar Código Externo está desabilitada, o nó de segundo nível é um nó [Código Externo] que contém o código do sistema e da estrutura que inicia e para o aplicativo, desenha a interface do usuário, controla o agendamento de thread e fornece ao aplicativo outros serviços de nível inferior.
    Step 3 Os filhos do nó de segundo nível são métodos e rotinas assíncronas do código de usuário que são chamados ou criados pelo sistema de segundo nível e código do framework.
    Step 4 Os nós filhos de um método só contêm dados das chamadas do método pai. Quando Mostrar Código Externo é desabilitado, os métodos de aplicativo também podem conter um nó [Código Externo].

    Aqui há mais informações sobre os valores de coluna:

    • Total de CPU indica quanto trabalho foi feito pela função e por todas as funções chamadas por ela. Valores altos de total de CPU apontam para as funções que são mais dispendiosas em geral.

    • Própria CPU indica quanto trabalho foi feito pelo código no corpo da função, exceto o trabalho realizado pelas funções que foram chamadas por ele. Valores altos de Própria CPU podem indicar um gargalo de desempenho dentro da própria função.

    • Módulos O nome do módulo que contém a função ou o número de módulos que contêm as funções em um nó [Código Externo].

    Para ver as chamadas de função que usam a maior porcentagem de CPU no modo de exibição de árvore de chamadas, clique em Expandir Afunilamento.

    Screenshot that shows Diagnostics Tools Hot Path.

    Observação

    Se você visualizar o código na árvore de chamadas marcado como código "interrompido" ou "pilha inexplorável", isso indica que os eventos ETW (Rastreamento de Eventos para Windows) provavelmente foram descartados. Tente coletar o mesmo rastreamento uma segunda vez para resolver o problema.

Exibir código externo

O código externo são funções nos componentes do sistema e da estrutura executadas pelo código escrito. O código externo inclui funções que iniciam e param o aplicativo, elaboram a interface do usuário, controlam a segmentação e fornecem ao aplicativo outros serviços de nível inferior. Na maioria dos casos, você não está interessado em código externo, portanto, a ferramenta Uso de CPU reúne as funções externas de um método de usuário em um nó [External Code].

Se você quiser exibir os caminhos de chamada do código externo, escolha Mostrar Código Externo na lista Filtrar exibição e, em seguida, escolha Aplicar.

Screenshot that shows Choose Filter View, then Show External Code.

Saiba que muitas correntes de chamada de código externo são muito aninhadas, de forma que a largura da coluna Nome da Função pode exceder a largura da tela de todos os monitores de computador, exceto dos maiores. Quando isso acontece, os nomes de função são mostrados como [...] .

Use a caixa de pesquisa para localizar um nó que você esteja procurando e use a barra de rolagem horizontal para exibir os dados.

Dica

Se você analisar um código externo que chama funções do Windows, deverá garantir que tem os arquivos .pdb mais atuais. Sem esses arquivos, as exibições de relatório listarão nomes de funções do Windows criptografadas e difíceis de entender. Para saber mais sobre como garantir que você tem os arquivos necessários, confira Especificar arquivos de símbolo (.pdb) e de origem no depurador.

Próximas etapas

Neste tutorial, você aprendeu como coletar e analisar dados de uso da CPU. Se você já concluiu o tour do criador de perfil, convém ler sobre uma abordagem geral para otimizar o código usando as ferramentas de criação de perfil.

Neste tutorial, você aprendeu a coletar e analisar dados de uso da CPU durante a depuração. Talvez você queira saber mais sobre a criação de perfil de builds de versão usando o Criador de Perfil de Desempenho.