C# unter der Haube: So beschleunigen Sie Code mit Profiling

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

Ihre C#-Anwendung läuft langsam? Zeit, unter die Haube zu schauen



Sie haben schönen, sauberen C#-Code geschrieben, aber er läuft langsamer als gewünscht. Kommt Ihnen bekannt vor? In der modernen Entwicklung wird die C#-Leistung oft zum entscheidenden Faktor: Benutzer verzeihen keine langen Ladezeiten, und Serveranwendungen müssen Tausende von Anfragen pro Sekunde bewältigen. Die gute Nachricht: .NET bietet leistungsstarke Werkzeuge für die .NET-Diagnose und das C#-Profiling. Die schlechte Nachricht: Ohne Verständnis des Prozesses riskieren Sie, das Falsche zu optimieren.



In diesem Artikel analysieren wir, wie man C#-Code richtig profiliert, echte C#-Engpässe findet und bewährte Techniken der C#-Code-Optimierung anwendet. Sie erfahren, warum intuitive Vermutungen oft täuschen und wie Sie BenchmarkDotNet und die ETW-Ablaufverfolgung nutzen, um objektive Daten zu erhalten. Los geht's!



Warum „nach Augenmaß“ nicht funktioniert: Mythen über Optimierung



Bevor Sie sich an die C#-Code-Optimierung machen, räumen wir mit populären Missverständnissen auf. Viele Entwickler glauben zu wissen, wo ihre Anwendung langsamer wird. In der Praxis zeigt das C#-Profiling: 90 % der Zeit werden in 10 % des Codes verbracht, und diese „Hot Spots“ befinden sich oft an unerwarteten Stellen.



Typische Fehler:

  • Vorzeitige Optimierung — Sie investieren Stunden in die Beschleunigung von Abschnitten, die nur einmal am Tag ausgeführt werden.
  • Vertrauen auf die Intuition — „Diese LINQ-Abfrage ist bestimmt langsam“ (wobei das Problem in Wirklichkeit in der Serialisierung liegt).
  • Ignorieren des GC — Der Garbage Collector kann bis zu 30 % der CPU-Zeit „fressen“, wenn Sie den Speicher nicht richtig verwalten.


Fazit: Die C#-Leistung muss gemessen, nicht erraten werden. Dafür gibt es professionelle Werkzeuge.



Werkzeuge für das C#-Profiling



Im .NET-Ökosystem gibt es mehrere Wege für die .NET-Diagnose. Betrachten wir die wichtigsten.



BenchmarkDotNet – Ihr bester Freund



BenchmarkDotNet ist der Goldstandard für Mikro-Benchmarking. Es führt den Code automatisch mehrfach aus, wärmt den JIT auf, berücksichtigt Rauschen und liefert statistisch signifikante Ergebnisse. Verwenden Sie es, um zwei Implementierungen einer Methode zu vergleichen.



Beispiel: Vergleichen wir eine normale for-Schleife mit einer foreach-Schleife für ein Array:



using BenchmarkDotNet.Attributes;using BenchmarkDotNet.Running;

[MemoryDiagnoser] // misst Speicherzuweisungpublic 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>();}


Wenn Sie diesen Code ausführen, werden Sie sehen, dass die C#-Leistung für foreach bei Arrays identisch mit for ist – der JIT optimiert beide Varianten gleich. Bei List<T> kann foreach jedoch aufgrund von Bereichsprüfungen langsamer sein.



Visual Studio-Profiler und dotMemory



Für ein umfassendes C#-Profiling auf Anwendungsebene verwenden Sie den integrierten Profiler von Visual Studio (verfügbar in der Enterprise-Version) oder das kostenlose dotMemory von JetBrains. Diese zeigen:

  • Welche Methoden die meiste CPU-Zeit verbrauchen.
  • Wie viel Speicher zugewiesen wird und wie der GC arbeitet.

Blogs

Buchempfehlungen