Freigeben über


Messen der Anwendungsleistung durch Analysieren der CPU-Auslastung (C#, Visual Basic, C++, F#)

Suchen Sie Leistungsprobleme beim Debuggen mit dem in den Debugger integrierten Diagnosetool für die CPU-Auslastung. Sie können die CPU-Auslastung auch ohne einen angefügten Debugger analysieren oder indem Sie eine ausgeführte App als Ziel festlegen. Weitere Informationen finden Sie unter Ausführen von Profilerstellungstools für Release- oder Debugbuilds und Analysieren der Leistung mit CPU-Profilerstellung.

Wenn der Debugger angehalten wird, sammelt das CPU-Auslastung-Tool im Diagnosetools-Fenster Informationen zu den in der Anwendung ausgeführten Funktionen. Das Tool listet die Funktionen auf, die Aufgaben ausgeführt haben. Außerdem wird ein Zeitachsendiagramm zur Verfügung gestellt, das Sie verwenden können, um sich auf bestimmte Segmente der Samplingsitzung zu konzentrieren.

Wichtig

Die in den Debugger integrierten Diagnosetools werden für die .NET-Entwicklung in Visual Studio, darunter ASP.NET, ASP.NET Core und native/C++-Entwicklung unterstützt. Die entsprechende Visual Studio Workload ist erforderlich. Windows 8 und höher werden benötigt, um Profiling-Tools mit dem Debugger zu verwenden (Fenster „Diagnosetools“).

In diesem Tutorial werden Sie lernen:

  • Sammeln von CPU-Auslastungsdaten
  • Analysieren von CPU-Auslastungsdaten

Schritt 1: Sammeln von CPU-Auslastungsdaten

  1. Öffnen Sie das Projekt, das Sie in Visual Studio debuggen möchten, und legen Sie in Ihrer App einen Haltepunkt an dem Punkt fest, an dem Sie die CPU-Auslastung untersuchen möchten.

  2. Legen Sie einen zweiten Haltepunkt am Ende der Funktion oder des Codebereichs an, den Sie analysieren möchten.

    Durch das Festlegen von zwei Haltepunkten können Sie die Datensammlung auf die Teile des Code begrenzen, die Sie analysieren möchten.

  3. Das Fenster Diagnosetools wird automatisch angezeigt. Es sei denn, Sie haben es deaktiviert. Klicken Sie auf Debuggen>Windows>Diagnosetools anzeigen, um das Fenster erneut aufzurufen.

  4. Mithilfe der Einstellung Auswahltools auf der Symbolleiste können Sie auswählen, ob Sie die CPU-Auslastung, Speicherauslastung oder beides anzeigen möchten. Wenn Sie Visual Studio Enterprise ausführen, können Sie IntelliTrace unter Extras>Optionen>IntelliTrace aktivieren oder deaktivieren.

    Screenshot, der Diagnosetools zeigt.

    Screenshot der Diagnosetools.

    Wir werden hauptsächlich die CPU-Auslastung betrachten, stellen Sie also sicher, dass CPU-Auslastung aktiviert ist (ist standardmäßig aktiviert).

  5. Klicken Sie auf Debug>Debugging starten (oder Start auf der Symbolleiste oder F5).

    Wenn das Laden der Anwendung abgeschlossen ist, wird die Zusammenfassungsansicht der Diagnosetools angezeigt. Wenn Sie das Fenster öffnen müssen, klicken Sie auf Debuggen>Windows>Diagnosetools anzeigen.

    Screenshot mit der Registerkarte „Zusammenfassung der Diagnosetools“.

    Screenshot mit der Registerkarte „Zusammenfassung der Diagnosetools“.

    Weitere Informationen zu den Ereignissen finden Sie unter Suchen und Filtern auf der Registerkarte „Ereignisse“ im Fenster „Diagnosetools“.

  6. Führen Sie das Szenario aus, bei dem Ihr erster Haltepunkt erreicht wird.

  7. Aktivieren Sie während der Debugger angehalten wird die Sammlung von CPU-Auslastungsdaten, und öffnen Sie anschließend die Registerkarte CPU-Auslastung.

    Screenshot, der zeigt, dass die Diagnosetools die CPU-Profilerstellung aktivieren.

    Screenshot, der zeigt, dass die Diagnosetools die CPU-Profilerstellung aktivieren.

    Wenn Sie CPU-Profil aufzeichnenauswählen, beginnt Visual Studio mit der Protokollierung Ihrer Funktionen und wie viel Zeit sie in Anspruch nehmen. Sie können diese gesammelten Daten nur anzeigen lassen, wenn Ihre Anwendung an einem Haltepunkt angehalten wird.

  8. Drücken Sie F5, um die App bis zum zweiten Haltepunkt auszuführen.

    Jetzt verfügen Sie über Leistungsdaten für Ihre Anwendung, die speziell für den Codebereich gelten, der zwischen den beiden Haltepunkten liegt.

    Der Profiler beginnt, Threaddaten vorzubereiten. Warten Sie, bis dieser Vorgang abgeschlossen ist.

    Screenshot mit Diagnosetools zur Vorbereitung von Threads.

    Screenshot mit Diagnosetools zur Vorbereitung von Threads.

    Das CPU-Auslastungstool zeigt den Bericht unter der Registerkarte CPU-Auslastung an.

    Screenshot mit der Registerkarte

    Screenshot mit der Registerkarte

  9. Wenn Sie einen spezifischeren Codebereich zur Analyse auswählen möchten, wählen Sie einen Bereich in der CPU-Zeitachse aus (es muss ein Bereich sein, der Profilerstellungsdaten anzeigt).

    Screenshot, der Diagnosetools zeigt, die ein Zeitsegment auswählen.

    Screenshot, der Diagnosetools zeigt, die ein Zeitsegment auswählen.

    An diesem Punkt können Sie beginnen, die Daten zu analysieren. Wenn Sie Probleme beim Sammeln oder Anzeigen von Daten haben, lesen Sie Behandeln von Profilerstellungsfehlern und Beheben von Problemen.

    Tipp

    Wenn Sie versuchen, Leistungsprobleme zu identifizieren, sollten Sie mehrere Messungen erfassen. Die Leistung variiert natürlich von Ausführung zu Ausführung, und Codepfade werden aufgrund der einmaligen Initialisierungslast bei der ersten Ausführung langsam ausgeführt, z. B. aufgrund des Ladens von DLL-Dateien, der Just-In-Time-Kompilierung von Methoden und der Initialisierung der Caches. Wenn Sie mehrere Messungen durchführen, erhalten Sie eine bessere Vorstellung vom Bereich und Median der angezeigten Metrik, mit der Sie die anfängliche Leistung mit der stabilen Leistungsfähigkeit eines Codebereichs vergleichen können.

Schritt 2: Analysieren von CPU-Auslastungsdaten

Beginnen Sie bei der Datenanalyse am besten mit der Liste der Funktionen unter „CPU-Auslastung“, stellen Sie fest welche Funktionen die meisten Aufgaben ausführen, und betrachten Sie die einzelnen Funktionen näher.

  1. Untersuchen Sie in der Liste der Funktionen die Funktionen, die am meisten Aufgaben ausführen.

    Screenshot der Funktionsliste „CPU-Auslastung“ der Diagnosetools.

    Screenshot, der die Funktionsliste „CPU-Auslastung“ der Diagnosetools zeigt.

    Tipp

    Die Auflistung der Funktionen beginnt mit der Funktion, die die meisten Aufgaben ausführt (sie sind nicht in der Reihenfolge der Aufrufe gelistet). Dadurch können Sie schnell feststellen, welche Funktionen am längsten ausgeführt werden.

  2. Doppelklicken Sie in der Liste der Funktionen auf eine der Funktionen Ihrer App, die viele Aufgaben ausführt.

    Wenn Sie auf eine Funktion doppelklicken, wird die Ansicht Funktionen im linken Bereich geöffnet. Wählen Sie im Dropdownmenü die Ansicht Anrufer/Angerufener aus.

    Screenshot mit „Diagnosetools“-Ansicht „Anrufer/Angerufener“.

    In dieser Ansicht wird die ausgewählte Funktion in der Überschrift und im Feld Aktuelle Funktion angezeigt (in diesem Beispiel „DoWork“). Die Funktion, die die aktuelle Funktion aufgerufen hat, wird links unter Aufrufende Funktion angezeigt, und alle Funktionen, die von der aktuellen Funktion aufgerufen wurden werden im Feld Aufgerufene Funktionen auf der rechten Seite angezeigt. (Sie können beide Felder auswählen, um die aktuelle Funktion zu ändern.)

    In dieser Ansicht wird Ihnen die Gesamtzeit (ms) und der Prozentsatz der gesamten Ausführungszeit der App angezeigt, den die Funktion bis zum Abschluss eingenommen hat. Unter Funktionstext wird ebenso die Gesamtzeit (und der Prozentsatz der Zeit) angezeigt, die im Funktionstext aufgewendet wurde. Die Zeit, die in aufrufenden und aufgerufenen Funktionen aufgewendet wurde, ist nicht enthalten.

    Wenn Sie auf eine Funktion doppelklicken, öffnet sich die Ansicht Aufrufer/Aufgerufener im linken Bereich.

    Screenshot mit „Diagnosetools“-Ansicht „Anrufer/Angerufener“.

    In dieser Ansicht erscheint die ausgewählte Funktion in der Überschrift und im Feld Aktuelle Funktion ( in diesem Beispiel „GetNumber“). Die Funktion, die die aktuelle Funktion aufgerufen hat, wird links unter Aufrufende Funktion angezeigt, und alle Funktionen, die von der aktuellen Funktion aufgerufen wurden werden im Feld Aufgerufene Funktionen auf der rechten Seite angezeigt. (Sie können beide Felder auswählen, um die aktuelle Funktion zu ändern.)

    In dieser Ansicht wird Ihnen die Gesamtzeit (ms) und der Prozentsatz der gesamten Ausführungszeit der App angezeigt, den die Funktion bis zum Abschluss eingenommen hat. Unter Funktionstext wird ebenso die Gesamtzeit (und der Prozentsatz der Zeit) angezeigt, die im Funktionstext aufgewendet wurde. Die Zeit, die in aufrufenden und aufgerufenen Funktionen aufgewendet wurde, ist nicht enthalten. (In diesem Beispiel wurden 2.367 von 2.389 ms im Funktionstext aufgewendet, und die verbleibenden 22 ms wurden im von dieser Funktion aufgerufenen externen Code aufgewendet).

    Tipp

    Hohe Werte unter Funktionsrumpf deuten auf einen Leistungsengpass in der Funktion selbst hin.

  3. Um eine Ansicht auf höherer Ebene anzuzeigen, in der die Reihenfolge angezeigt wird, in der die Funktionen aufgerufen werden, wählen Sie Rufenbaum aus der Dropdown-Liste oben im Fensterbereich aus.

    Jeder nummerierte Bereich in der Abbildung bezieht sich auf einen Schritt in der Prozedur.

    Aufrufstruktur der Diagnosetools

    Bild Beschreibung
    Schritt 1 Der Knoten der obersten Ebene in der CPU-Auslastungsaufrufstruktur, die die Anwendung darstellt.
    Schritt 2 Wenn die Option Externen Code anzeigen deaktiviert ist, ist in den meisten Apps der Knoten der zweiten Ebene ein [External Code] -Knoten, der den System- und Frameworkcode enthält, der die App startet und beendet, die Benutzeroberfläche zeichnet, die Threadplanung steuert und andere Dienste der unteren Ebene für die App bereitstellt.
    Schritt 3 Die untergeordneten Elemente des Knotens der zweiten Ebene sind die Benutzercodemethoden und asynchronen Routinen, die vom System- und Frameworkcode der zweiten Ebene aufgerufen oder erstellt werden.
    Schritt 4 Untergeordnete Knoten einer Methode enthalten Daten nur für die Aufrufe der übergeordneten Methode. Wenn Externen Code anzeigen deaktiviert ist, können App-Methoden auch den Knoten [Externer Code] enthalten.

    Hier finden Sie weitere Informationen zu den Spaltenwerten:

    • Die Gesamt-CPU gibt an, wie viel Arbeit von der Funktion und von allen von ihr aufgerufenen Funktionen geleistet wurde. Hohe Werte bei „Gesamt-CPU“ deuten auf die insgesamt aufwändigsten Funktionen hin.

    • Mit dem Wert Eigen-CPU wird das bewältigte Pensum des Codes im Funktionsrumpf angegeben. Das Pensum der Funktionen, die durch den Code aufgerufen wurden, ist nicht enthalten. Hohe Werte bei Eigen-CPU deuten auf einen Leistungsengpass in der Funktion selbst hin.

    • Module: Der Name des Moduls mit der Funktion oder die Anzahl der Module, die die Funktionen in einem Knoten vom Typ [Externer Code] enthalten.

    Um die Funktionsaufrufe anzuzeigen, die den höchsten Prozentsatz der CPU in der Ansicht der Aufrufstruktur verwenden, klicken Sie auf Langsamsten Pfad erweitern. Der langsamste Pfad kann dazu beitragen, ihre Untersuchung auf den Bereich zu konzentrieren, der die meisten Auswirkungen haben würde.

    Screenshot mit langsamstem Pfad der Diagnosetools.

    Hinweis

    Wenn Sie in der Aufrufstruktur Code sehen, der als „broken“ oder „unwalkable stack“ markiert ist, bedeutet dies, dass Ereignisse aus der Ereignisablaufverfolgung für Windows (Event Tracing for Windows , ETW) wahrscheinlich gelöscht wurden. Versuchen Sie, die gleiche Ablaufverfolgung ein zweites Mal zu erfassen, um das Problem zu beheben.

  1. Um eine andere Ansicht der Daten anzuzeigen, wählen Sie Flame-Diagramm aus der Dropdownliste am oberen Rand des Bereichs aus.

    Das Flame-Diagramm bietet eine andere Visualisierung der Anrufstruktur, die Ihnen dabei helfen kann, die Daten zu analysieren. Weitere Informationen finden Sie unter Identifizieren der langsamsten Pfade mit dem Flame-Diagramm.

  2. Um Ansichten der nach Funktion oder Modul aggregierten Daten anzuzeigen, wählen Sie Funktionen oder Module in der Dropdownliste oben im Bereich aus.

    Diese Ansichten helfen, Funktionen oder Module zu identifizieren, die aufgrund einer Kombination aus hohen Anrufanzahl- und/oder Leistungsproblemen leistungsengpässe sein können.

    Screenshot der Ansicht

Externen Code anzeigen

Externer Code umfasst Funktionen in System- und Frameworkkomponenten, die vom Code ausgeführt werden, den Sie schreiben. Externer Code umfasst Funktionen, die die App starten und beenden, die Benutzeroberfläche zeichnen, das Threading steuern und der App andere hardwarenahe Dienste bereitstellen. In den meisten Fällen sind Sie nicht an externem Code interessiert, und daher sammelt das CPU-Auslastungstool die externen Funktionen einer Benutzermethode in einem [externen Aufruf] Knoten.

Wenn Sie die Aufrufpfade von externem Code anzeigen möchten, deaktivieren Sie Nur eigenen Code anzeigen aus der Liste Einstellungen, und wählen Sie dann Übernehmen aus.

Screenshot, der die Einstellungen und dann „Nur eigenen Code anzeigen“ zeigt.

Externer Code umfasst Funktionen in System- und Frameworkkomponenten, die vom Code ausgeführt werden, den Sie schreiben. Externer Code umfasst Funktionen, die die App starten und beenden, die Benutzeroberfläche zeichnen, das Threading steuern und der App andere hardwarenahe Dienste bereitstellen. In den meisten Fällen sind Sie nicht an externem Code interessiert, weshalb das CPU-Auslastungstool die externen Funktionen einer Benutzermethode im Knoten [Externer Code] sammelt.

Wenn Sie die Aufrufpfade von externem Code anzeigen möchten, wählen Sie aus der Liste Filteransicht die Option Externen Code anzeigen und dann Übernehmenaus.

Screenshot, der „Filteransicht auswählen“ und dann „Externer Code anzeigen“ zeigt.

Achten Sie darauf, dass viele externe Codeaufrufketten tief verschachtelt sind, sodass die Breite der Spalte mit dem Funktionsnamen die Anzeigebreite aller außer sehr großer Computerbildschirme überschreiten kann. In diesem Fall werden Funktionsnamen als […] angezeigt.

Verwenden Sie das Suchfeld, um nach einem gewünschten Knoten zu suchen, und verwenden Sie dann die horizontale Bildlaufleiste, um die Daten sichtbar zu machen.

Tipp

Wenn Sie externen Code profilieren, der Windows-Funktionen aufruft, sollten Sie sicherstellen, dass Sie über die aktuellsten .pdb Dateien verfügen. Ohne diese Dateien werden in den Berichtsansichten kryptische und schwer verständliche Namen von Windows-Funktionen aufgeführt. Weitere Informationen zum Sicherstellen, dass Sie über die erforderlichen Dateien verfügen, finden Sie unter Angeben von Symbol- (PDB) und Quelldateien im Debugger.

Nächste Schritte

In diesem Tutorial haben Sie gelernt, wie CPU-Auslastungsdaten gesammelt und analysiert werden. Wenn Sie bereits die Tour des Profilersabgeschlossen haben, könnte es sinnvoll sein, ein Tutorial zu durchlaufen, das Ihnen zeigt, wie Sie die Tools effektiver nutzen können.

In diesem Tutorial haben Sie gelernt, wie CPU-Auslastungsdaten beim Debuggen gesammelt und analysiert werden. Möglicherweise möchten Sie mehr darüber erfahren, wie Sie Release-Builds mit dem Leistungsprofiler analysieren können.