Freigeben über


Analyse der Performance durch CPU-Profiling im Performance Profiler (C#, Visual Basic, C++, F#)

Ein guter Ausgangspunkt für die Untersuchung von Leistungsproblemen in Ihrer App ist die CPU-Auslastung mit einem CPU-Profiler. Das Leistungstool zur CPU-Auslastung von Visual Studio zeigt die aktive CPU-Berechnungszeit 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. Es bietet automatische Einblicke und verschiedene Ansichten Ihrer Daten, sodass Sie Leistungsprobleme analysieren und diagnostizieren können.

  • Identifizieren von Leistungsproblemen in DevOps-Szenarien Beispielsweise kann das Tool helfen, wenn ein Kunde meldet, dass einige Anforderungen oder Bestellungen während der 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.

  • Überprüfen auf hohe CPU-Auslastung: 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. Sie können das CPU-Nutzungstool mithilfe der Tastenkombination Alt+F2ausführen und dann CPU-Auslastungauswählen oder ein bereits gesammeltes Protokoll mithilfe eines Tools wie dotnet-trace oder dotnet-monitoröffnen. (Für .NET-Produktionscode würden Sie so am wahrscheinlichsten Ablaufverfolgungen erfassen.)

Sie können das CPU-Verwendungstool auf einem geöffneten Visual Studio-Projekt, auf einer installierten Microsoft Store-App oder auf eine ausgeführte App oder einen laufenden Prozess ausführen. Sie können das CPU-Auslastungstool auf Release- oder Debugbuilds ausführen. Weitere Informationen finden Sie unter Ausführen von Profilerstellungstools für Release- oder Debugbuilds.

Die folgenden Anweisungen zeigen, wie Sie das Tool für die CPU-Auslastung ohne den Debugger mit dem Visual Studio-Leistungs-Profiler 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. Im Lernprogramm Fallstudie: Leitfaden für Anfänger zur Optimierung von Codewird gezeigt, wie Sie die Leistung mithilfe des CPU-Auslastungstools verbessern können.

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 „Lokaler Computer“

    Screenshot der Auswahl von „Release“ und „Lokaler Computer“

  2. Wählen Sie Debuggen>Leistungsprofiler aus.

  3. Wählen Sie unter Verfügbare ToolsCPU-Auslastungaus, und wählen Sie dann Startaus.

    Screenshot von „CPU-Auslastung auswählen“.

    Screenshot von „CPU-Auslastung auswählen“.

    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 Profiler-Einstellungen.

  4. Nach dem Starten der App beginnt die Diagnosesitzung und zeigt CPU-Auslastungsdaten an. Wenn Sie mit dem Sammeln von Daten fertig sind, wählen Sie Datenerfassung stoppenaus.

    Screenshot: Beenden der Datensammlung zur CPU-Auslastung

    Screenshot: Beenden der Datensammlung zur CPU-Auslastung

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

    Screenshot, der den Bericht

    Screenshot, der den Bericht

    Verwenden Sie das Filter Dropdown-Menü, um Threads auszuwählen oder abzuwählen, und verwenden Sie das Feld Suchen, um nach einem bestimmten Thread oder Knoten zu suchen.

CPU-Auslastungsdatenspalten

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

Die Millisekunden der CPU-Berechnungszeit und der CPU-Prozentsatz, der durch Aufrufe der Funktion sowie durch die von der Funktion aufgerufenen Funktionen im ausgewählten Zeitraum genutzt werden. 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, %] Selbst % Gleichung

Die Millisekunden der CPU-Rechenzeit und der CPU-Prozentsatz, der durch Aufrufe der Funktion im ausgewählten Zeitraum genutzt wird, ohne die Funktionen, die von der Funktion aufgerufen werden.
Modul In einigen Ansichten wird die Spalte „Modul“ angezeigt, die den Namen des Moduls mit der Funktion enthält.

Analysieren von CPU-Erkenntnissen

Wenn im Abschnitt Top Insights Einblicke angezeigt werden, verwenden Sie den bereitgestellten Link, um weitere Informationen zum identifizierten Problem zu erhalten. Wenn Sie Copilot verwenden, öffnen Sie mit der Schaltfläche Copilot fragen das Copilot-Chatfenster, und Copilot stellt Vorschläge basierend auf Ihrem Code und allen identifizierten Problemen bereit.

Weitere Informationen finden Sie unter CPU-Erkenntnisse.

Analysieren der 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:

Ansicht Beschreibung
Aufrufer/Aufgerufener Detaillierte Ansicht der CPU-Zeit für eine bestimmte Funktion, die Funktion(en), die sie aufgerufen haben, und die Funktionen, die sie aufruft. Die Leistungsdaten werden für den Datensammlungszeitraum aggregiert. Sie können aufrufende Funktionen und aufgerufene Funktionen auswählen, um den Aufrufpfad zu durchlaufen.
Telefonbaum Hierarchische Ansicht des Funktionsaufrufpfads. Wird verwendet, um Anrufpfade zu identifizieren, die die meiste CPU-Zeit (hot path) in Anspruch nehmen.
Module Ansicht der CPU-Zeit für einzelne Module, aggregiert über den Datensammlungszeitraum. Wird verwendet, um Module zu identifizieren, die aufgrund einer Kombination aus hohen Anrufanzahlen und/oder Leistungsproblemen leistungsengpässe sein können.
Funktionen Ansicht der CPU-Zeit für einzelne Funktionen, aggregiert über den Datensammlungszeitraum. Wird verwendet, um Funktionen zu identifizieren, die aufgrund einer Kombination aus hohen Anrufanzahlen und/oder Leistungsproblemen leistungsengpässe sein können.
Flame-Diagramm Hierarchische Ansicht des Funktionsaufrufpfads in einer Flammendiagrammvisualisierung. Wird verwendet, um Anrufpfade zu identifizieren, die die meiste CPU-Zeit (hot path) in Anspruch nehmen.

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

Der Bericht bietet verschiedene Ansichten der Diagnosedaten:

  • Aufrufer/Aufgerufener
  • Telefonbaum

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 Funktion doppelklicken, an der Sie interessiert sind, und Sie sehen die Quelle für die Funktion sowie Hervorhebungen, die zeigen, wo in dieser Funktion die meiste Zeit verbracht 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 einen Leistungsengpass darstellt. Ermitteln Sie, wie viele Daten die Methode darstellt, um festzustellen, ob Code oder Laufzeitbibliotheken von Drittanbietern der Grund dafür sind, dass Ihre Endpunkte langsam oder ressourcenintensiv sind.

Weitere Informationen zur Verwendung des Flame-Diagramms finden Sie unter Identifizieren der langsamsten Pfade mit einem Flame-Diagramm.

CPU-Auslastungsaufrufstruktur

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 "Hot Path erweitern" und "Hot Path anzeigen" klicken, um die Funktionsaufrufe anzuzeigen, die den höchsten Prozentsatz der CPU in der Aufrufstrukturansicht verwenden.

Struktur der Aufrufstruktur

Screenshot, der die Anrufbaumstruktur zeigt.

Screenshot, der die Anrufbaumstruktur zeigt.

Bild Beschreibung
Schritt 1 Der Knoten der obersten Ebene in der CPU-Auslastungsaufrufstruktur, die die Anwendung darstellt.
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 Anruf]-Knoten sammelt.

Deaktivieren Sie zum Anzeigen der Aufrufpfade von externem Code auf der Hauptseite mit der Zusammenfassung des Berichts (rechter Bereich) in der Dropdownliste Einstellungen die Option Nur eigenen Code anzeigen, und klicken Sie dann auf Anwenden. (Die Dropdownliste Einstellungen finden Sie auf der Hauptseite mit der Zusammenfassung des Berichts, nicht in den Detailansichten.)

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

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.

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 Option „Externen Code anzeigen“.

Wenn Sie Nur eigenen Code anzeigen deaktivieren, erweitert die Ansicht Aufrufstruktur der Seite CPU-Auslastung die Aufrufe 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 des geschachtelten externen Codes 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 des geschachtelten externen Codes 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 die Suche nach geschachteltem externen Code zeigt.

Screenshot, der die Suche nach geschachteltem externen Code zeigt.

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.

In dem folgenden Beispiel sind die ersten beiden Knoten unter [Externer Code] die compiler-generierten Methoden der Zustandsautomatenklasse. Der dritte Knoten ist der Aufruf der ursprünglichen Methode.

Screenshot: asynchroner Knoten.

Erweitern Sie die generierten Methoden, um zu zeigen, 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 des Einstellungssymbols für die CPU-Auslastung.

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

    Screenshot der 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 der Anrufanzahldaten.