Analysieren der Leistung mithilfe der CPU-Profilerstellung im Leistungs-Profiler (C#, Visual Basic, C++, F#)

Eine gute Möglichkeit zur Untersuchung von Leistungsproblemen in Ihrer Anwendung ist die Untersuchung der CPU-Auslastung mit einem CPU-Profiler. Das Leistungstool für die CPU-Auslastung zeigt die CPU-Zeit und den prozentualen Anteil an, der für die Ausführung von Code in C++ und C#/Visual Basic verwendet wird.

Das CPU-Auslastungstool kann Ihnen bei Folgendem helfen:

  • Diagnostizieren einer Verlangsamung oder eines Hängenbleibens eines Prozesses in der Codebasis Ihres Teams. Das Tool kann Ihnen helfen, ein Problem mit dem Produktionscode Ihres Teams zu diagnostizieren. Das Tool bietet automatische Einblicke und verschiedene Ansichten Ihrer Daten, sodass Sie Leistungsprobleme analysieren und diagnostizieren können.

  • Identifizieren Sie Leistungsprobleme in DevOps-Szenarios, z. B. wenn ein Kunde meldet, dass einige Anfragen oder Bestellungen während Spitzenzeiten nicht bei der Einzelhandelswebsite ankommen. Die Probleme liegen häufig bei der Produktion, und es ist schwierig, zu diesem Zeitpunkt einen Debugprozess durchzuführen. Dieses Tool kann Ihnen aber dabei helfen, genügend Informationen und Beweise zu diesem Problem zu erfassen. Nach dem Erfassen einer Ablaufverfolgungsdatei kann die Analyse Ihnen schnell helfen, potenzielle Ursachen zu verstehen und Vorschläge im Kontext Ihres Codes zu geben, damit Sie die nächsten Schritte ausführen können, um das Problem zu beheben.

  • Wenn Ihr Latenzproblem nicht an einer API-Anforderung liegt, können Sie mit dem CPU-Auslastungstool nach einer hohen CPU-Auslastung und anderen verwandten Problemen suchen. Das CPU-Auslastungstool kann Ihnen helfen, Engpässe zu identifizieren, um Optimierungsmöglichkeiten einzugrenzen.

Das CPU-Nutzungstool ist sowohl für lokale Ablaufverfolgungssitzungen als auch für die Produktion hilfreich. Das CPU-Auslastungstool kann auch mithilfe der Tastenkombination Alt+F2 und dann durch Auswahl von CPU-Auslastung oder durch Öffnen einer bereits erfassten Ablaufverfolgung mithilfe eines Tools wie dotnet-trace oder dotnet-monitor initiiert werden. (Für .NET-Produktionscode würden Sie so am wahrscheinlichsten Ablaufverfolgungen erfassen.)

Das Tool für die CPU-Auslastung kann auf einem geöffneten Visual Studio-Projekt oder auf einer installierten Microsoft Store-App ausgeführt oder an eine laufende App oder einen laufenden Prozess angefügt werden. Sie können das Tool für die CPU-Auslastung mit oder ohne Debuggen ausführen. Weitere Informationen finden Sie unter Ausführen von Profilerstellungstools mit oder ohne Debugger.

Die folgenden Anweisungen zeigen, wie Sie das Tool für die CPU-Auslastung ohne den Debugger mit dem Visual Studio-Leistungsprofiler verwenden. In den Beispielen wird ein Releasebuild verwendet, der auf einem lokalen Computer erstellt wurde. Releasebuilds bieten die beste Ansicht der tatsächlichen App-Leistung. Eine Anleitung zur Verbesserung der Leistung mithilfe des Tools CPU-Auslastung finden Sie unter Anleitung für Anfänger zur Optimierung von Code.

In der Regel repliziert der lokale Computer die Ausführung der installierten App am besten. Führen Sie die App direkt auf dem Gerät und nicht über eine Remotedesktopverbindung aus, um Daten von einem Remotegerät zu sammeln.

Sammeln von CPU-Auslastungsdaten

  1. Legen Sie im Visual Studio-Projekt die Konfiguration der Projektmappe auf Release fest, und wählen Sie als Bereitstellungsziel Lokaler Windows-Debugger (oder Lokaler Computer) aus.

    Screenshot der Auswahl von Release und lokalem Computer

    Screenshot der Auswahl von Release und lokalem Computer

  2. Wählen Sie Debuggen>Leistungsprofiler aus.

  3. Wählen Sie unter Verfügbare Tools die Option CPU-Auslastung und dann Starten aus.

    Screenshot der Auswahl von CPU-Auslastung

    Screenshot der Auswahl von CPU-Auslastung

    Wenn Sie die Option Mit angehaltener Sammlung starten vor dem Starten des Profilers aktivieren, werden die Daten erst erfasst, wenn Sie in der Diagnosesitzungsansicht die Schaltfläche Aufzeichnen auswählen.

    Hinweis

    Weitere Informationen zur Optimierung des Tools finden Sie unter Optimieren der Profilereinstellungen.

  4. Nach dem Start der App beginnt die Diagnosesitzung und zeigt Daten zur CPU-Auslastung an. Wenn Sie mit dem Sammeln der Daten fertig sind, klicken Sie auf Sammlung beenden.

    Screenshot des Beendens der Datensammlung zur CPU-Auslastung

    Screenshot des Beendens der Datensammlung zur CPU-Auslastung

    Das CPU-Auslastungstool analysiert die Daten und zeigt den Bericht an. Wenn Probleme beim Sammeln oder Anzeigen von Daten haben, lesen Sie Behandeln von Profilerstellungsfehlern und Beheben von Problemen.

    Screenshot des Berichts zur CPU-Auslastung

    Screenshot des Berichts zur CPU-Auslastung

    Verwenden Sie die Dropdownliste Filter, um das Anzeigen von Threads zu aktivieren bzw. deaktivieren. Verwenden Sie das Feld Suchen, um nach einem bestimmten Thread oder Knoten zu suchen.

Spalten mit CPU-Auslastungsdaten

Name Beschreibung
CPU gesamt [Einheit, %] Gesamt % Datengleichung

Die Millisekunden und der prozentuale CPU-Anteil, der im ausgewählten Zeitbereich durch Aufrufe der Funktion und die von der Funktion aufgerufenen Funktionen verwendet wurde. Dies unterscheidet sich vom Zeitachsendiagramm CPU-Auslastung, das die gesamte CPU-Aktivität in einem Zeitbereich mit der insgesamt verfügbaren CPU vergleicht.
Eigen-CPU [Einheit, %] Eigen % Gleichung

Die Millisekunden und der prozentuale CPU-Anteil, der im ausgewählten Zeitbereich durch Aufrufe der Funktion verwendet wurde. Die von der Funktion aufgerufenen Funktionen sind dabei ausgeschlossen.
Modul In einigen Ansichten wird die Spalte „Modul“ angezeigt, die den Namen des Moduls mit der Funktion enthält.

Analysieren von CPU-Erkenntnissen

Informationen zur Analyse der wichtigsten Erkenntnisse und Funktionen sowie des langsamsten Pfads finden Sie unter CPU-Erkenntnisse.

Analysieren Sie die CPU-Auslastung

Klicken Sie zum Analysieren des CPU-Auslastungsberichts auf Details öffnen, oder klicken Sie auf eine der wichtigsten Funktionen, um die Ansicht Funktionen zu öffnen.

Der Bericht bietet verschiedene Ansichten der Diagnosedaten:

  • Aufrufer/Aufgerufener
  • Aufrufstruktur
  • Module
  • Functions
  • Flammendiagramm

Klicken Sie zum Analysieren des Berichts auf Ausführlichen Bericht erstellen.

Der Bericht bietet verschiedene Ansichten der Diagnosedaten:

  • Aufrufer/Aufgerufener
  • Aufrufstruktur

In allen Ansichten (mit Ausnahme von Aufrufer/Angerufener) wird der Diagnosebericht nach Gesamt CPU sortiert, vom höchsten zum niedrigsten Wert. Ändern Sie die Sortierreihenfolge oder sortieren Sie eine Spalte, indem Sie auf die Spaltenüberschrift klicken. Sie können auf eine für Sie interessante Funktion doppelklicken, um die Quelle der Funktion anzuzeigen. Damit erhalten Sie auch eine Hervorhebung, die anzeigt, wo in dieser Funktion Zeit verbraucht wird. Die Tabelle enthält Spalten mit Daten wie z. B. die in der Funktion verbrachte Zeit einschließlich der aufgerufenen Funktionen (CPU gesamt), und eine zweite Spalte, die die in einer Funktion verbrachte Zeit ohne die aufgerufenen Funktionen angibt (Eigen-CPU).

Diese Daten können bei der Bewertung helfen, ob die Funktion selbst ein Leistungsengpass ist. Ermitteln Sie, wie viele Daten die Methode anzeigt, um festzustellen, ob Code oder Runtimebibliotheken von Drittanbietern der Grund dafür sind, dass Ihre Endpunkte langsam oder ressourcenintensiv sind.

Weitere Informationen zur Verwendung des Flammendiagramms finden Sie unter Identifizieren der langsamsten Pfade mit einem Flammendiagramm.

Die Aufrufstruktur der CPU-Auslastung

Wählen Sie zum Anzeigen der Aufrufstruktur im Bericht den übergeordneten Knoten aus. Daraufhin wird standardmäßig die Seite CPU-Auslastung in der Ansicht Aufrufer/Aufgerufener geöffnet. Wählen Sie in der Dropdownliste Aktuelle Ansicht die Option Aufrufstruktur aus.

Sie können auf die Schaltflächen Langsamsten Pfad erweitern und Langsamsten Pfad anzeigen klicken, um die Funktionsaufrufe anzuzeigen, die den höchsten Prozentsatz der CPU in der Ansicht der Aufrufstruktur verwenden.

Struktur der Aufrufstruktur

Screenshot der Struktur der Aufrufstruktur

Screenshot der Struktur der Aufrufstruktur

Image BESCHREIBUNG
Schritt 1 Der oberste Knoten in Aufrufstrukturen der CPU-Auslastung ist ein Pseudoknoten.
Schritt 2 In den meisten Apps ist bei deaktivierter Option Externen Code anzeigen der Knoten der zweiten Ebene ein [Externer Code] -Knoten. Der Knoten enthält den System- und Frameworkcode, der die App startet und beendet, die Benutzeroberfläche zeichnet, die Threadplanung steuert und der App weitere Dienste auf unterer Ebene 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 nur Daten für die Aufrufe der übergeordneten Methode. Wenn Externen Code anzeigen deaktiviert ist, können App-Methoden auch den Knoten [Externer Code] enthalten.

Externer Code

System- und Frameworkfunktionen, die von Ihrem Code ausgeführt werden, werden als externer Code bezeichnet. Funktionen mit externem Code starten und beenden die App, zeichnen die Benutzeroberfläche, steuern das Threading und stellen der App weitere Dienste auf unterer Ebene bereit. In den meisten Fällen sind Sie nicht an externem Code interessiert, weshalb die Aufrufstruktur „CPU-Auslastung“ die externen Funktionen einer Benutzermethode in einem [Externer Code] -Knoten sammelt.

Um die Aufrufpfade des externen Codes anzuzeigen, wechseln Sie zur aktuellen Ansicht der Anrufstruktur, oder klicken Sie mit der rechten Maustaste, und wählen Sie die Option In Aufrufstruktur anzeigen aus.

Screenshot der Anzeige in der Aufrufstruktur

Wählen Sie zum Anzeigen der Aufrufpfade von externem Code auf der Hauptseite des Diagnoseberichts (rechter Bereich) in der Dropdownliste Filter die Option Externen Code anzeigen aus, und klicken Sie dann auf Anwenden. In der Ansicht Aufrufstruktur der Seite CPU-Auslastung werden dann die externen Codeaufrufe erweitert. (Die Dropdownliste Filter finden Sie auf der Hauptdiagnoseseite, nicht in den Detailansichten.)

Screenshot der Anzeige von externem Code

Viele externe Codeaufrufketten sind tief verschachtelt, sodass die Breite der Kette die Anzeigebreite der Spalte Funktionsname überschreiten kann. Die Funktionsnamen werden dann wie in der folgenden Abbildung dargestellt angezeigt.

Screenshot von geschachteltem externem Code in der Aufrufstruktur

Viele externe Codeaufrufketten sind tief verschachtelt, sodass die Breite der Kette die Anzeigebreite der Spalte Funktionsname überschreiten kann. Die Funktionsnamen werden dann als ... angezeigt.

Screenshot von geschachteltem externem Code in der Aufrufstruktur

Verwenden Sie das Suchfeld, um einen Funktionsnamen zu finden. Zeigen Sie auf die ausgewählte Zeile, oder verwenden Sie die horizontale Scrollleiste, um die Daten anzuzeigen.

Screenshot der Suche nach geschachteltem externem Code

Screenshot der Suche nach geschachteltem externem Code

Asynchrone Funktionen in der Aufrufstruktur der CPU-Auslastung

Wenn der Compiler auf eine asynchrone Methode trifft, erstellt er eine versteckte Klasse zum Steuern der Ausführung der Methode. Vom Konzept her ist die Klasse ein Zustandsautomat. Die Klasse verfügt über vom Compiler generierte Funktionen, die die ursprünglichen Methoden sowie die Rückrufe, Planer und Iteratoren, die für deren Ausführung erforderlich sind, asynchron aufrufen. Wenn eine übergeordnete Methode die ursprüngliche Methode aufruft, entfernt der Compiler die Methode aus dem Ausführungskontext der übergeordneten Methode und führt die Methoden der ausgeblendeten Klasse im Kontext des System- und Frameworkcodes durch, der die Ausführung der App steuert. Die asynchronen Methoden werden oft, jedoch nicht immer, in einem oder mehreren verschiedenen Threads ausgeführt. Dieser Code wird in der Aufrufstruktur CPU-Auslastung als untergeordnete Elemente des Knotens [Externer Code] direkt unter dem obersten Knoten der Struktur angezeigt.

Im folgenden Beispiel sind die ersten beiden Knoten unter [Externer Code] die vom Compiler generierten Methoden der Zustandsautomatklasse. Der dritte Knoten ist der Aufruf der ursprünglichen Methode.

Screenshot eines asynchronen Knotens

Erweitern Sie die generierten Methoden, um zu sehen, was passiert:

Screenshot eines erweiterten asynchronen Knotens

Screenshot eines erweiterten asynchronen Knotens

  • MainPage::GetMaxNumberAsyncButton_Click verwaltet nur eine Liste der Aufgabenwerte, berechnet das Maximum der Ergebnisse und zeigt die Ausgabe an.

  • MainPage+<GetMaxNumberAsyncButton_Click>d__3::MoveNext zeigt die erforderliche Aktivität zum Planen und Starten der 48 Aufgaben, die den Aufruf von GetNumberAsyncumschließen.

  • MainPage::<GetNumberAsync>b__b zeigt die Aktivität der Aufgaben an, die GetNumber aufrufen.

Aufrufanzahl erfassen (.NET)

Wenn Sie die Aufrufanzahl in der Ansicht „Funktionen“ anzeigen möchten, können Sie die Einstellung aktivieren, bevor Sie den Profiler starten. Diese Einstellung wird für .NET-Projekttypen unterstützt und erfordert den Start des Prozesses unter dem Profiler. Das Anfügen-Szenario wird nicht unterstützt.

  1. Wählen Sie im Leistungs-Profiler das Symbol Einstellungen für CPU-Auslastung aus.

    Screenshot: Symbol „Einstellungen“ für die CPU-Auslastung

  2. Aktivieren Sie die Option Aufrufanzahl erfassen (nur .NET).

    Screenshot: Einstellungen für die CPU-Auslastung

  3. Erfassen Sie CPU-Auslastungsdaten.

  4. Öffnen Sie die Ansicht „Funktionen“, und stellen Sie dann sicher, dass die Sichtbarkeit der Spalte Aufrufanzahl festgelegt ist.

    Wenn die Spalte nicht angezeigt wird, klicken Sie mit der rechten Maustaste auf eine Spaltenüberschrift, um sichtbare Spalten auszuwählen.

    Screenshot: Daten zur Aufrufanzahl