Redgate logo for print use

ANTS Performance ProfilerANTS Performance Profiler

Walkthrough: ASP.NET-Profiling mit dem ANTS Performance Profiler

In diesem Walkthrough zeigen wir, wie Sie eine Beispiel-Website namens NerdDinner profilieren und dabei die ASP.NET-Leistung verbessern können. Den Originalcode können Sie von CodePlex herunterladen. Für dieses Beispiel wurde der Code jedoch angepasst, um gezielt ein Performanceproblem darzustellen.

Angepasste NerdDinner-Version herunterladen

Öffnen Sie die Lösung in Visual Studio und erstellen Sie das Projekt neu, damit die PDB-Dateien korrekt verknüpft sind. Die Datenbank läuft auf SQL CE. Es ist keine weitere Konfiguration erforderlich.

Das Szenario

Ein Nutzer hat gemeldet, dass NerdDinner bei der Suche auf der Startseite sehr langsam reagiert. Sie möchten herausfinden, ob sich die Performance der Anwendung verbessern lässt, bevor Sie in die Analyse der Datenbank oder in neue Hardware investieren.

Der Ablauf besteht aus drei Schritten:

  1. ANTS Performance Profiler für ASP.NET-Profiling einrichten

  2. NerdDinner verwenden

  3. Profilergebnisse analysieren

ANTS Performance Profiler einrichten

In diesem Beispiel wird NerdDinner im Visual Studio Web Development Server profiliert. Gehen Sie dazu wie folgt vor:

  1. Wählen Sie im Startbildschirm von ANTS Performance Profiler „New Profiling Session“ und dann den Tab „Web Dev. Server – ASP.NET“.

  2. Wählen Sie unter ASP.NET-Webanwendung (Pfad) den NerdDinner-Ordner aus.

  3. Wählen Sie den gewünschten Profiling-Modus. In diesem Fall nutzen wir Zeilen- und Methodenzeiten nur für Methoden mit vorhandenem Quellcode.

  4. Choosing the ASP.NET profiling mode
  5. Klicken Sie auf „Start Profiling“.

  6. Der Standardbrowser öffnet sich und lädt die NerdDinner-Seite.

ANTS Performance Profiler launches NerdDinner in the default browser

NerdDinner verwenden

Die NerdDinner Site enthält mehrere Seiten mit datenbanklastigem Code und statischem HTML. Angenommen, Nutzer berichten, dass die Standortsuche sehr langsam ist - wir testen dies, indem wir einen Ortsnamen eingeben und auf „Search“ klicken. Die Suche liefert eine Liste mit Veranstaltungen in der Nähe.

Während der Nutzung zeigt die Zeitachse im Profiler die CPU-Auslastung der Anwendung:

Looking at NerdDinner's CPU usage

Beim Laden der Seite gibt es einen kurzen, erwarteten CPU-Peak. Danach fällt die Last auf nahezu Null, bis wir die Suche starten. Die Auslastung steigt auf 100 % und bleibt dort rund 10 Sekunden. Das weist deutlich auf einen Engpass in der Suchfunktion hin.

Jetzt, da wir den Engpass vermuten, untersuchen wir die Ergebnisse im Detail.

Profilergebnisse analysieren

Markieren Sie auf der Zeitachse den Bereich, in dem die CPU-Auslastung hoch war. Nach kurzer Zeit erscheinen die detaillierten Ergebnisse.

Im Aufrufbaum zeigt der Profiler ganz oben den „heißesten“ Stacktrace – also den Code, der am meisten CPU-Zeit beansprucht. Dies ist meist ein guter Startpunkt für Optimierungen.

The 'hottest' stack trace in the Call Tree

Am Anfang jedes Stacktraces steht die HTTP-Anfrage, die die .NET-Methoden ausgelöst hat. Wie erwartet stammt der heißeste Stacktrace aus der Anfrage http://localhost:8013/Search/SearchByLocation - deren Child Method verursachen den Großteil der Laufzeit.

Im Stack sehen wir, dass durch diese Anfrage eine .NET-Methode aufgerufen wurde: JsonDinnerFromDinners(Dinner dinner) – sie wurde 7076-mal aufgerufen, die zugehörige SQL-SELECT-Anfrage sogar 1000-mal ausgeführt.

Weitere Informationen zu Stacktraces und HTTP-Knoten finden Sie unter Arbeiten mit dem Aufrufbaum.

Wenn wir die übergeordnete Methode SearchByLocation(float latitude, float longitude) auswählen, sehen wir deren Quellcode. Da wir im Modus mit Zeilenprofilierung gearbeitet haben, erkennen wir auch, welche Codezeilen besonders viel Zeit beansprucht haben. Dabei zeigt sich, dass die Methode alle Einträge aus der Datenbank abruft:

Looking inside a method, with line-level timings

Die Methode FindByLocation(float latitude, float longitude) verarbeitet anschließend das komplette Ergebnis in der Webseite, um nach Standort zu filtern:

The method tries to process a set of database results on the web page

Diese Methoden sind klare Kandidaten für eine Optimierung. Etwa durch einen AJAX-Aufruf und eine gezielte Abfrage, die nur passende Einträge per Längen- und Breitengrad zurückliefert.

Weitere Informationen zur Quellcodeansicht finden Sie unter Arbeiten mit dem Quellcode.

Nach dem Profiling wissen wir nun genau, welche HTTP-Anfragen mit Performanceproblemen verbunden sind und welche Methoden im .NET-Code optimiert werden müssen. Wir kennen die Engpässe und wissen, wie wir sie reproduzieren und beheben können.