C# sob o capô: como acelerar o código com profiling

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

Sua aplicação C# está lenta? Hora de olhar sob o capô



Você escreveu um código bonito e limpo em C#, mas ele roda mais devagar do que gostaria. Familiar? No desenvolvimento moderno, o desempenho em C# frequentemente se torna um fator decisivo: os usuários não perdoam carregamentos longos, e as aplicações de servidor precisam suportar milhares de requisições por segundo. A boa notícia: o .NET fornece ferramentas poderosas para diagnóstico .NET e profiling C#. A má notícia: sem entender o processo, você corre o risco de otimizar o que não precisa.



Neste artigo, vamos abordar como fazer profiling de código C# corretamente, encontrar gargalos reais em C# e aplicar técnicas comprovadas de otimização de código C#. Você descobrirá por que os palpites intuitivos frequentemente falham e como usar BenchmarkDotNet e rastreamento ETW para obter dados objetivos. Vamos nessa!



Por que "no olho" não funciona: mitos sobre otimização



Antes de começar a otimização de código C#, vamos desmistificar crenças populares. Muitos desenvolvedores acham que sabem onde seu programa está lento. Na prática, o profiling C# mostra: 90% do tempo é gasto em 10% do código, e esses "pontos quentes" frequentemente estão em lugares inesperados.



Erros típicos:

  • Otimização prematura — você gasta horas acelerando trechos que são executados uma vez por dia.
  • Confiança na intuição — "Essa consulta LINQ com certeza está lenta" (mas na verdade o problema está na serialização).
  • Ignorar o GC — o coletor de lixo pode "consumir" até 30% do tempo de CPU se você gerenciar a memória incorretamente.


Conclusão: o desempenho em C# precisa ser medido, não adivinhado. Para isso, existem ferramentas profissionais.



Ferramentas para profiling C#



No ecossistema .NET, existem várias maneiras de fazer diagnóstico .NET. Vamos ver as principais.



BenchmarkDotNet — seu melhor amigo



BenchmarkDotNet é o padrão ouro para microbenchmarks. Ele executa automaticamente o código várias vezes, aquece o JIT, leva em conta ruídos e fornece resultados estatisticamente significativos. Use-o para comparar duas implementações de um mesmo método.



Exemplo: comparando um loop for comum com foreach para um array:



using BenchmarkDotNet.Attributes;using BenchmarkDotNet.Running;

[MemoryDiagnoser] // mede a alocação de memóriapublic class LoopBenchmarks{ private int[] _data;

[GlobalSetup] public void Setup() { _data = Enumerable.Range(0, 1000).ToArray(); }

[Benchmark] public int ForLoop() { int sum = 0; for (int i = 0; i < _data.Length; i++) sum += _data[i]; return sum; }

[Benchmark] public int ForeachLoop() { int sum = 0; foreach (var item in _data) sum += item; return sum; }}

class Program{ static void Main() => BenchmarkRunner.Run<LoopBenchmarks>();}


Ao executar este código, você verá que o desempenho em C# para foreach em arrays é idêntico ao for — o JIT otimiza ambas as variantes igualmente. Mas para List<T>, o foreach pode ser mais lento devido às verificações de limites.



Profiler do Visual Studio e dotMemory



Para um profiling C# completo no nível da aplicação, use o profiler integrado do Visual Studio (disponível na versão Enterprise) ou o gratuito dotMemory da JetBrains. Eles mostrarão:

  • Quais métodos consomem mais CPU.
  • Quanta memória está sendo alocada e ge

Blogs

Book Recommendations