Compartilhar via


Analisar dados do BenchmarkDotNet no Visual Studio

Você pode usar as ferramentas de criação de perfil para coletar e exibir dados BenchmarkDotNet no Visual Studio. BenchmarkDotNet é uma biblioteca .NET de software livre projetada para benchmarking de desempenho. Ele automatiza o processo de medir e comparar o tempo de execução, o uso da memória e outras métricas de desempenho do código .NET de maneira confiável e repetível.

Você usa BenchmarkDotNet instalando pacotes NuGet necessários em seu projeto e adicionando atributos ao código que correspondem ao tipo de informações de desempenho em que você está interessado.

Pré-requisitos

Configurar o seu projeto

Os atributos de parâmetro de comparação devem ser adicionados a um aplicativo de console .NET. Os atributos podem ser adicionados a funções wrapper que fazem referência a outros tipos de projeto.

Para preparar seu projeto para suporte ao BenchmarkDotNet, use um dos seguintes métodos:

  • Abra um projeto de console existente ou crie um novo projeto de console. Nesse cenário, você adicionará manualmente o suporte ao BenchmarkDotNet.

  • Use o modelo do Projeto de Parâmetro de Comparação . Algumas das etapas descritas neste artigo são necessárias somente quando você adiciona manualmente o suporte ao BenchmarkDotNet.

    O modelo Benchmark Project gera um projeto BenchmarkDotNet totalmente integrado com suporte interno para criação de perfil de uso da CPU e insights do Copilot. Para usar o modelo, selecione Criação de perfil na lista de tipos de projeto ao criar um novo projeto e escolha o Projeto de Parâmetro de Comparação. Para obter informações sobre atributos, consulte Atribuir seu código.

Captura de tela do modelo BenchmarkDotNet no Visual Studio.

Crie um projeto de console ou use um projeto de console existente.

Os atributos de parâmetro de comparação devem ser adicionados a um aplicativo de console .NET. Os atributos podem ser adicionados a funções wrapper que fazem referência a outros tipos de projeto.

Atribuir seu código

Ao adicionar um diagnosticador BenchmarkDotNet às classes de benchmark como um atributo, você configura o aplicativo para gerar um arquivo .diagsession após a execução dos benchmarks. Em seguida, você pode abrir o arquivo .diagsession no Visual Studio e exibir dados de criação de perfil para os parâmetros de comparação.

Há suporte para os seguintes diagnósticos:

  • CPUUsageDiagnoser
  • Diagnosticador do Banco de Dados
  • DotNetCountersDiagnoser
  • EventsDiagnoser
  • FileIODiagnoser

Cada diagnosticador gera dados de desempenho relacionados a esse diagnosticador. Por exemplo, o CPUUsageDiagnoser gera um arquivo .diagsession com dados de CPU e o DatabaseDiagnoser gera um arquivo .diagsession com dados em operações de banco de dados. As limitações correspondem à ferramenta de criação de perfil associada. Por exemplo, a ferramenta de análise Banco de Dados funciona com ADO.NET ou Entity Framework Core.

Para atribuir seu código para diagnósticos e parâmetros de comparação:

  1. Adicione o nome do diagnosticador como um atributo à classe que contém os parâmetros de comparação para os quais você deseja gerar dados.

  2. Adicione o Benchmark atributo aos métodos que você deseja testar para obter desempenho.

    Por exemplo, você pode usar o código a seguir para o CPUUsageDiagnoser.

    Se você estiver usando o modelo do Projeto de Comparação , o código de exemplo já será fornecido no modelo. Se você estiver adicionando manualmente o suporte ao BenchmarkDotNet, poderá usar o código de exemplo a seguir.

    using System;
    using System.Security.Cryptography;
    using BenchmarkDotNet.Attributes;
    using BenchmarkDotNet.Running;
    using Microsoft.VSDiagnostics;
    
    namespace MyBenchmarks
    {
        [CPUUsageDiagnoser]
        public class Md5VsSha256
        {
            private const int N = 10000;
            private readonly byte[] data;
    
            private readonly SHA256 sha256 = SHA256.Create();
            private readonly MD5 md5 = MD5.Create();
    
            public Md5VsSha256()
            {
                data = new byte[N];
                new Random(42).NextBytes(data);
            }
    
            [Benchmark]
            public byte[] Sha256() => sha256.ComputeHash(data);
    
            [Benchmark]
            public byte[] Md5() => md5.ComputeHash(data);
        }
    
        public class Program
        {
            public static void Main(string[] args)
            {
                var summary = BenchmarkRunner.Run(typeof(Program).Assembly);
            }
        }
    }
    

Coletar e exibir dados Benchmark.NET

  1. Altere o build para um build de release em vez de um build de depuração.

  2. Execute o aplicativo para gerar o arquivo .diagsession .

    Verifique a saída do console para obter o local do arquivo. Por exemplo:

    // * Diagnostic Output - VSDiagnosticsDiagnoser * 
    Collection result moved to 'BenchmarkDotNet_Md5VsSha256_20231218_123326.diagsession'.
    Session : {7f38bcc2-c692-4266-aa24-b12bc5325ea4}
      Stopped
    Exported diagsession file: *.diagsession
    
  3. No Visual Studio, selecione Arquivo > Abrir > Arquivo e navegue até o local do arquivo .diagsession, e então selecione e abra o arquivo.

  4. Selecione a guia Benchmarks para exibir dados dos benchmarks do BenchmarkDotNet.

    Captura de tela dos dados do BenchmarkDotNet no Visual Studio.

    Para obter mais informações sobre os resultados na guia Benchmarks , consulte a documentação do BenchmarkDotNet .

  5. Clique com o botão direito do mouse em uma linha nos resultados e escolha Selecionar intervalo de tempo para sincronizar o grafo da linha do tempo com o parâmetro de comparação.

  6. Selecione uma das guias disponíveis, como Uso da CPU ou Alocações.

    Dependendo do diagnosticador usado para coletar dados, você pode obter insights relacionados à alocação de memória, ao uso da CPU, aos contadores e a outros dados de desempenho. Para analisar alocações de memória, use o MemoryDiagnoser interno adicionando o atributo [MemoryDiagnoser]. Para obter mais informações, consulte Diagnosticers.

    Observação

    O criador de perfil dá suporte apenas ao [MemoryDiagnoser] e aos diagnosticadores listados anteriormente neste artigo.

    Para obter um exemplo de como usar o profiler para analisar alocações de memória, consulte o post do blog Benchmarking com o Visual Studio Profiler.

    Para analisar dados relacionados a outras guias, como Uso da CPU, confira os artigos correspondentes na documentação de perfil.

Otimizar com Copilot

Você pode ativar otimizações de alocação de CPU e memória para seus benchmarks BenchmarkDotNet diretamente do editor usando CodeLens. Isso torna o ajuste de desempenho mais acessível e contínuo, ajudando você a encontrar e corrigir problemas de alocação de CPU e memória exatamente onde você codifica.

Selecione o indicador CodeLens acima do seu parâmetro de comparação e, em seguida, selecione a opção Otimizar Alocações com Copilot.

Captura de tela da otimização com o Copilot.