Perfilamento de código C#: encontrando gargalos na prática

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Introdução: por que o perfilamento é um must-have para o desenvolvedor C#

Cada desenvolvedor já se deparou com a situação: o código funciona, mas é lento. Onde procurar o problema? Palpites intuitivos frequentemente falham. É aqui que o perfilamento de código C# entra em cena — uma abordagem sistemática para identificar gargalos de desempenho.

Ao contrário da simples medição de tempo com Stopwatch, o perfilamento profissional permite entender não apenas o que está lento, mas também por quê. Neste artigo, abordaremos ferramentas e métodos práticos para desenvolvedores .NET: desde recursos integrados do Visual Studio até profilers especializados.



Quando perfilhar?

  • A aplicação está mais lenta do que o esperado
  • Observam-se problemas de memória (vazamentos, alta pressão do GC)
  • É necessário otimizar uma seção crítica do código antes do lançamento
  • Alta carga na CPU ou I/O


1. Configuração do ambiente e ferramentas básicas

Antes de começar o perfilamento, vamos preparar o projeto. Para os exemplos, usaremos um aplicativo de console .NET 8. Crie o projeto e adicione a classe DataProcessor com um método potencialmente lento.



public class DataProcessor{    private List<int> _data;

public DataProcessor() { _data = Enumerable.Range(0, 1000000).ToList(); }

public double CalculateAverage() { double sum = 0; foreach (var item in _data) { sum += item; } return sum / _data.Count; }

public List<int> FilterEvenNumbers() { var result = new List<int>(); foreach (var item in _data) { if (item % 2 == 0) result.Add(item); } return result; }}


Profiler integrado do Visual Studio (Diagnostic Tools)

A maneira mais rápida de começar é usar as Diagnostic Tools no Visual Studio. Execute o aplicativo com depuração (F5) e abra a janela "Ferramentas de Diagnóstico" (Debug > Windows > Show Diagnostic Tools).

  • Aba CPU Usage — mostra quais métodos consomem mais tempo de processador
  • Aba Memory Usage — monitora a alocação de memória e a coleta de lixo
  • Aba Events — mostra exceções, carregamento de módulos

Para um perfilamento preciso, use o Performance Profiler (Debug > Performance Profiler). Selecione "CPU Usage" e "Instrumentation" — isso fornecerá informações detalhadas sobre cada chamada.



2. Perfilamento de CPU e busca de gargalos

Vamos considerar um exemplo real. Suponha que o método FilterEvenNumbers seja chamado em um loop 1000 vezes. Mediremos o desempenho usando o BenchmarkDotNet — o padrão ouro para benchmarking em .NET.



Instalação e configuração do BenchmarkDotNet

// Instale o pacote via NuGet: dotnet add package BenchmarkDotNet

using BenchmarkDotNet.Attributes;using BenchmarkDotNet.Running;

public class DataProcessorBenchmark{ private DataProcessor _processor;

[GlobalSetup] public void Setup() { _processor = new DataProcessor(); }

[Benchmark] public double TestCalculateAverage() => _processor.CalculateAverage();

[Benchmark] public List<int> TestFilterEvenNumbers() => _processor.FilterEvenNumbers();}

class Program{ static void Main(string[] args) { var summary = BenchmarkRunner.Run<DataProcessorBenchmark>(); }}

Após a execução, você obterá uma tabela com os resultados: tempo de execução, alocação de memória, alocações. Isso apontará imediatamente para os pontos problemáticos.



Análise dos resultados

Suponha que TestFilterEvenNumber

Blogs

Book Recommendations