Profilage du code C# : trouver les goulots d'étranglement en pratique
\nL'optimisation des performances est l'une des tâches clés du développeur. Même le plus beau code peut fonctionner lentement s'il contient des goulots d'étranglement. Dans cet article, nous allons voir comment profiler du code C# dans l'environnement .NET, trouver les zones problématiques et les corriger. Vous découvrirez des outils pratiques comme BenchmarkDotNet, dotMemory et le Stopwatch intégré, et vous obtiendrez des exemples prêts à l'emploi pour l'analyse.
Pourquoi le profilage est-il important ?
\nLe profilage ne consiste pas simplement à lancer une application et à mesurer le temps. C'est une approche systématique pour identifier les « goulots d'étranglement » : algorithmes lents, fuites mémoire, requêtes non optimales vers la base de données ou allocations fréquentes sur le tas. Sans profilage, vous risquez de passer des heures à optimiser des parties qui fonctionnent déjà rapidement, en négligeant les véritables problèmes.
\n\n1. Profilage avec Stopwatch (démarrage rapide)
\nLa façon la plus simple de mesurer le temps d'exécution du code est d'utiliser la classe System.Diagnostics.Stopwatch. Elle convient pour une évaluation préliminaire, mais pas pour des benchmarks précis en raison de l'influence de la compilation JIT et des processus en arrière-plan.
Exemple d'utilisation de Stopwatch
\nusing System.Diagnostics;\n\npublic class Example\n{\n public void Run()\n {\n Stopwatch sw = Stopwatch.StartNew();\n\n // Code à mesurer\n SimulateWork();\n\n sw.Stop();\n Console.WriteLine($"Temps d'exécution : {sw.ElapsedMilliseconds} ms");\n }\n\n private void SimulateWork()\n {\n for (int i = 0; i < 1_000_000; i++)\n {\n // Simulation de travail\n }\n }\n}\nInconvénients : Stopwatch ne prend pas en compte le préchauffage JIT, le garbage collection et d'autres facteurs. Pour une analyse sérieuse, utilisez des bibliothèques spécialisées.
\n\n2. Profilage professionnel avec BenchmarkDotNet
\nBenchmarkDotNet est la référence en matière de benchmarking dans .NET. Il préchauffe automatiquement le code, exécute plusieurs itérations, analyse les statistiques et prend en compte l'impact du garbage collector. Installez le package via NuGet :
dotnet add package BenchmarkDotNet\n\nExemple de benchmark pour comparer deux méthodes
\nusing BenchmarkDotNet.Attributes;\nusing BenchmarkDotNet.Running;\n\npublic class StringBenchmark\n{\n private string[] data = { "apple", "banana", "cherry", "date" };\n\n [Benchmark]\n public string ConcatWithPlus()\n {\n string result = "";\n foreach (var s in data)\n result += s;\n return result;\n }\n\n [Benchmark]\n public string ConcatWithStringBuilder()\n {\n var sb = new System.Text.StringBuilder();\n foreach (var s in data)\n sb.Append(s);\n return sb.ToString();\n }\n}\n\npublic class Program\n{\n public static void Main()\n {\n var summary = BenchmarkRunner.Run<StringBenchmark>();\n }\n}\nAprès l'exécution, vous verrez un tableau avec le temps, les allocations mémoire et les erreurs. Cela vous permettra de comparer objectivement StringBuilder et la concaténation avec +.
3. Analyse de la mémoire avec dotMemory et Visual Studio Diagnostic Tools
\nLes goulots d'étranglement ne concernent pas seulement la vitesse, mais aussi la consommation mémoire. L'outil dotMemory de JetBrains et les outils intégrés de Visual Studio (Diagnostic Tools) aident à trouver les fuites, les allocations fréquentes et les objets qui vivent longtemps sur le tas.
Comment utiliser Visual Studio Diagnostic Tools
\n- \n
- Lancez l'application en mode Debug. \n
- Ouvrez la fenêtre Diagnostic Tools (Debug → Windows → Show Diagnostic Tools). \n
- Activez le profilage mémoire (Memory Usage) ou CPU (CPU Usage). \n
- Prenez un instantané mémoire (Snapshot) avant et après l'exécution du code.