Compartilhar via


Meça o desempenho do aplicativo analisando a utilização 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 ao focar em um aplicativo em execução. Para obter mais informações, consulte Executar ferramentas de criação de perfil em builds de versão ou de depuração e Analisar desempenho usando a criação de perfil da CPU.

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 utilização da CPU
  • Analisar dados de utilização da CPU

Etapa 1: Coletar dados de utilização 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 das Ferramentas de Diagnóstico é exibida automaticamente, a menos que você a tenha desativado. Para abrir a janela novamente, clique em Depurar>Windows>Mostrar Ferramentas de Diagnóstico.

  4. Você pode escolher se deseja ver o Uso da CPU , o Uso de Memória ou ambos, com a configuração Select Tools 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.

    Captura de tela que mostra as Ferramentas de Diagnóstico.

    Captura de tela que mostra as Ferramentas de Diagnóstico.

    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 termina de carregar, a visualização do Resumo das Ferramentas de Diagnóstico aparece. Se você precisar abrir a janela, clique em Depurar>Windows>Mostrar Ferramentas de Diagnóstico.

    Captura de tela que mostra a guia Resumo das Ferramentas de Diagnóstico.

    Captura de tela que mostra a guia Resumo das Ferramentas de Diagnóstico.

    Para obter mais informações sobre os eventos, consulte 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.

    Captura de tela que mostra que as Ferramentas de Diagnóstico habilitam a criação de perfil da CPU. DiagToolsEnableCPUProfiling

    Captura de tela que mostra que as Ferramentas de Diagnóstico habilitam a criação de perfil da CPU. DiagToolsEnableCPUProfiling

    Quando você escolhe Gravar Perfil de CPU, o Visual Studio começa a gravar suas funções e quanto tempo elas levam para executar. Você só pode visualizar esses dados coletados quando seu aplicativo está 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 a conclusão.

    Captura de tela que mostra as Ferramentas de Diagnóstico preparando threads.

    Captura de tela que mostra as Ferramentas de Diagnóstico preparando threads.

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

    Captura de tela que mostra a guia Uso da CPU das Ferramentas de Diagnóstico.

    Captura de tela que mostra a aba Uso da CPU das Ferramentas de Diagnóstico.

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

    Captura de tela que mostra as Ferramentas de Diagnóstico selecionando um segmento de tempo. DiagToolsSelectTimeSegment

    Captura de tela que mostra as Ferramentas de Diagnóstico selecionando um segmento de tempo. DiagToolsSelectTimeSegment

    Neste ponto, você pode começar a analisar os dados. ** Se você tiver problemas para coletar ou exibir dados, consulte Solucionar erros de perfilamento e corrigir questões.

    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 dados de utilização da 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.

    Captura de tela mostrando a Lista de Funções de Uso da CPU das Ferramentas de Diagnóstico.

    Captura de tela mostrando a Lista de Funções de Uso da CPU das Ferramentas de Diagnóstico.

    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.

    Captura de tela que mostra a Visualização de Chamada e Receptor das Ferramentas de Diagnóstico.

    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.

    Captura de tela que mostra a Visualização de Chamada e Receptor das Ferramentas de Diagnóstico.

    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.

    Árvore de chamadas de ferramentas de diagnóstico

    Imagem Descrição
    Etapa 1 O nó de nível superior na árvore de chamadas de uso da CPU, representando o aplicativo.
    Etapa 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.
    Etapa 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.
    Etapa 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:

    • CPU total indica quanto trabalho foi realizado pela função e por quaisquer funções chamadas por ela. Valores altos de CPU total 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 Caminho Crítico. O caminho crítico pode ajudar a concentrar sua investigação na área que teria mais impacto.

    Captura de tela que mostra o Caminho Crítico das Ferramentas de Diagnóstico. DiagToolsHotPath

    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.

  1. Para ver uma exibição diferente dos dados, selecione Flame Graph na lista suspensa na parte superior do painel.

    O flame graph fornece uma visualização diferente da árvore de chamadas que pode ajudar você a analisar os dados. Para obter mais informações, confira Identificar caminhos críticos com um flame graph.

  2. Para ver exibições dos dados agregados por função ou por módulo, selecione Functions ou Modules na lista suspensa na parte superior do painel.

    Essas exibições ajudam a identificar funções ou módulos que podem ser gargalos de desempenho devido a uma combinação de altas contagens de chamadas e/ou problemas de desempenho.

    Captura de tela que mostra o modo de exibição Funções das Ferramentas de Diagnóstico.

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 o threading e fornecem ao aplicativo outros serviços de nível inferior. Na maioria das vezes, você não estará interessado em código externo e, portanto, a ferramenta de uso da CPU reúne as funções externas de um método do usuário em um nó [Chamada Externa].

Se você quiser exibir os caminhos de chamada do código externo, desmarque Mostrar Apenas Meu Código na lista de Configurações e escolha Aplicar.

Captura de tela que mostra Configurações e, em seguida, Mostrar Apenas Meu Código.

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 o threading 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ó [Código Externo].

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.

Captura de tela que mostra Escolher Exibição de Filtro e, em seguida, Mostrar Código Externo.

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 perfilador, talvez queira seguir um tutorial que explica como usar as ferramentas com mais eficiência.

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.