Profilierung von C#-Code: Engpässe in der Praxis finden

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Einleitung: Warum Profilierung ein Must-have für C#-Entwickler ist

Jeder Entwickler kennt die Situation: Der Code funktioniert, aber langsam. Wo liegt das Problem? Intuitive Vermutungen führen oft in die Irre. Hier kommt die Profilierung von C#-Code ins Spiel – ein systematischer Ansatz zur Identifizierung von Leistungsengpässen.

Im Gegensatz zur einfachen Zeitmessung mit Stopwatch ermöglicht die professionelle Profilierung nicht nur zu verstehen, was bremst, sondern auch warum. In diesem Artikel behandeln wir praktische Werkzeuge und Methoden für .NET-Entwickler: von den integrierten Tools von Visual Studio bis hin zu spezialisierten Profilern.



Wann sollte profiliert werden?

  • Die Anwendung läuft langsamer als erwartet
  • Es treten Speicherprobleme auf (Lecks, hoher GC-Druck)
  • Ein kritischer Codeabschnitt muss vor der Veröffentlichung optimiert werden
  • Hohe CPU- oder I/O-Auslastung


1. Einrichtung der Umgebung und grundlegende Werkzeuge

Bevor wir mit der Profilierung beginnen, bereiten wir das Projekt vor. Für die Beispiele verwenden wir eine .NET 8-Konsolenanwendung. Erstellen Sie ein Projekt und fügen Sie eine Klasse DataProcessor mit einer potenziell langsamen Methode hinzu.



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; }}


Integrierter Profiler von Visual Studio (Diagnostic Tools)

Der schnellste Weg, um zu beginnen, ist die Verwendung der Diagnostic Tools in Visual Studio. Starten Sie die Anwendung mit Debugging (F5) und öffnen Sie das Fenster "Diagnosetools" (Debug > Windows > Diagnosetools anzeigen).

  • Die Registerkarte CPU-Auslastung – zeigt, welche Methoden die meiste Prozessorzeit verbrauchen
  • Die Registerkarte Speicherauslastung – verfolgt Speicherzuweisungen und Garbage Collection
  • Die Registerkarte Ereignisse – zeigt Ausnahmen, Modulladungen

Für eine genaue Profilierung verwenden Sie den Leistungsprofiler (Debug > Leistungsprofiler). Wählen Sie "CPU-Auslastung" und "Instrumentierung" – dies liefert detaillierte Informationen zu jedem Aufruf.



2. CPU-Profilierung und Suche nach Engpässen

Betrachten wir ein reales Beispiel. Angenommen, die Methode FilterEvenNumbers wird in einer Schleife 1000 Mal aufgerufen. Messen wir die Leistung mit BenchmarkDotNet – dem Goldstandard für Benchmarking in .NET.



Installation und Einrichtung von BenchmarkDotNet

// Installieren Sie das Paket über 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>(); }}

Nach dem Start erhalten Sie eine Tabelle mit Ergebnissen: Ausführungszeit, Speicherzuweisung, Allokationen. Dies zeigt sofort die Problemstellen auf.



Analyse der Ergebnisse

Angenommen, TestFilterEvenNumber

Blogs

Buchempfehlungen