Delen via


Prestaties analyseren met behulp van CPU-profilering in de Performance Profiler (C#, Visual Basic, C++, F#)

Een goede manier om te beginnen met het onderzoeken van prestatieproblemen in uw app is het CPU-gebruik ervan te begrijpen met behulp van een CPU-profiler. Het hulpprogramma voor CPU-gebruik van Visual Studio toont de cpu-actieve rekentijd en het percentage dat is besteed aan het uitvoeren van code in C++, C#/Visual Basic.

Het hulpprogramma CPU-gebruik kan u helpen:

  • Het diagnosticeren van een vertraging of een vastgelopen proces in de code van het team. Het hulpprogramma kan u helpen bij het vaststellen van het probleem met de productiecode van uw team. Het biedt automatische inzichten en verschillende weergaven van uw gegevens, zodat u prestatieproblemen kunt analyseren en diagnosticeren.

  • Prestatieproblemen in DevOps-scenario's identificeren Het hulpprogramma kan bijvoorbeeld helpen wanneer een klant rapporteert dat sommige aanvragen of bestellingen tijdens het hoogseizoen niet naar de retailwebsite gaan. Vaak zijn de problemen in productie en het is een uitdaging om op dat moment fouten op te sporen, maar dit hulpprogramma kan u helpen voldoende informatie en bewijs van het probleem vast te leggen. Nadat u een traceringsbestand hebt verzameld, kan de analyse u snel helpen bij het begrijpen van mogelijke oorzaken en suggesties geven binnen de context van uw code, zodat u de volgende stappen kunt uitvoeren om het probleem op te lossen.

  • Controleer op hoog CPU-gebruik Als uw latentieprobleem zich niet binnen een API-aanvraag bevindt, kunt u controleren op hoog CPU-gebruik en andere gerelateerde problemen met het hulpprogramma CPU-gebruik. Het hulpprogramma CPU-gebruik kan u helpen knelpunten te identificeren, zodat u kunt beperken waar u wilt optimaliseren.

Het hulpprogramma CPU-gebruik is handig voor zowel lokale traceringssessies als productie. U kunt het hulpprogramma CPU-gebruik uitvoeren met behulp van de sneltoets, Alt+F2en vervolgens CPU-gebruikkiezen of door een reeds verzamelde tracering te openen met behulp van een hulpprogramma zoals dotnet-trace of dotnet-monitor. (Voor .NET-productiecode is dit waarschijnlijk de wijze waarop u traceringen zou verzamelen.)

U kunt het hulpprogramma CPU-gebruik uitvoeren op een geopend Visual Studio-project, in een geïnstalleerde Microsoft Store-app of gekoppeld aan een actieve app of proces. U kunt het hulpprogramma CPU-gebruik uitvoeren op release- of debug-builds. Zie Hulpprogramma's voor profilering uitvoeren voor release of foutopsporing van buildsvoor meer informatie.

In de volgende instructies ziet u hoe u het hulpprogramma CPU-gebruik gebruikt zonder het foutopsporingsprogramma, met behulp van de Visual Studio Performance Profiler. In de voorbeelden wordt een release-build op een lokale computer gebruikt. Release-builds bieden de beste weergave van werkelijke app-prestaties. Zie voor een handleiding waarin wordt getoond hoe u de prestaties kunt verbeteren met het hulpprogramma CPU-gebruik, Casestudy: Handleiding voor beginners voor het optimaliseren van code.

Normaal gesproken repliceert de lokale computer de uitvoering van geïnstalleerde apps het beste. Als u gegevens van een extern apparaat wilt verzamelen, voert u de app rechtstreeks op het apparaat uit, niet via een verbinding met extern bureaublad.

Cpu-gebruiksgegevens verzamelen

  1. Stel in het Visual Studio-project de oplossingsconfiguratie in op Release- en selecteer Lokaal Windows-foutopsporingsprogramma (of lokale machine) als het implementatiedoel.

    Een schermafbeelding die 'Release selecteren' en 'Lokale machine' toont.

    Schermopname waarop 'Selecteer Release en Lokale machine'.

  2. Selecteer Debug>Performance Profiler.

  3. Selecteer onder Beschikbare hulpprogramma'sCPU-gebruiken selecteer Start.

    Schermafbeelding die CPU-gebruik selecteren toont.

    Schermafbeelding die CPU-gebruik selecteren toont.

    Als u de optie Beginnen met verzameling gepauzeerd inschakelt voordat u de profiler start, worden de gegevens pas verzameld wanneer u op de knop Record klikt in de diagnostische sessieweergave.

    Notitie

    Zie Profiler-instellingen optimaliserenvoor meer informatie over het efficiënter maken van het hulpprogramma.

  4. Nadat de app is gestart, wordt de diagnostische sessie gestart en worden gegevens over het CPU-gebruik weergegeven. Wanneer u klaar bent met het verzamelen van gegevens, selecteert u Verzameling stoppen.

    schermopname die laat zien hoe het verzamelen van gegevens over CPU-gebruik wordt gestopt.

    schermopname die laat zien hoe het verzamelen van gegevens over CPU-gebruik wordt gestopt.

    Het hulpprogramma CPU-gebruik analyseert de gegevens en geeft het rapport weer. Zie Profileringsfouten oplossen en problemen oplossenals u problemen ondervindt bij het verzamelen of weergeven van gegevens.

    Schermopname die het rapport CPU-gebruik toont.

    Schermopname die het rapport CPU-gebruik toont.

    Gebruik de vervolgkeuzelijst Filter om threads weer te geven of uit te schakelen en gebruik het vak Zoeken om te zoeken naar een specifieke thread of knooppunt.

Gegevenskolommen voor CPU-gebruik

Naam Beschrijving
totale CPU[eenheid, %] totaal % gegevensvergelijking

De milliseconden van de CPU-rekentijd en het CPU-percentage dat wordt gebruikt door aanroepen naar de functie en functies die door de functie worden aangeroepen, in het geselecteerde tijdsbereik. Dit verschilt van het CPU-gebruik tijdlijngrafiek, waarmee de totale CPU-activiteit in een tijdsbereik wordt vergeleken met de totale beschikbare CPU.
Self-CPU [eenheid, %] Zelf % vergelijking

De milliseconden van de CPU-rekentijd en het CPU-percentage dat wordt gebruikt door aanroepen naar de functie in het geselecteerde tijdsbereik, met uitzondering van functies die door de functie worden aangeroepen.
module In sommige weergaven wordt de kolom Module weergegeven, waarin de naam van de module met de functie wordt weergegeven.

CPU-inzichten analyseren

Als er inzichten worden weergegeven in de sectie Top Insights, gebruikt u de opgegeven koppeling voor meer informatie over het geïdentificeerde probleem. Als u Copilot gebruikt, wordt met de knop Ask Copilot bovendien het Copilot-chatvenster geopend. Copilot geeft suggesties op basis van uw code en eventuele geïdentificeerde problemen.

Zie CPU-inzichtenvoor meer informatie.

CPU-gebruik analyseren

Als u het rapport CPU-gebruik wilt analyseren, klikt u op Details openenof klikt u op een van de belangrijkste functies om de weergave Functions te openen.

Het rapport biedt verschillende weergaven van de diagnostische gegevens:

Bekijk Beschrijving
Beller/gebeld Gedetailleerde weergave van CPU-tijd voor een specifieke functie, de functie(s) die deze aanroept en de functie(s) die worden aangeroepen. De prestatiegegevens worden geaggregeerd voor de gegevensverzamelingsperiode. U kunt aanroepende functies en aangeroepen functies selecteren om het oproeppad te doorlopen.
Oproepstructuur Hiërarchische weergave van het functieaanroeppad. Wordt gebruikt om oproeppaden te identificeren die de meeste CPU-tijd (dynamisch pad) gebruiken.
Modules Weergave van de CPU-tijd die in afzonderlijke modules is besteed, geaggregeerd over de periode van gegevensverzameling. Wordt gebruikt om modules te identificeren die prestatieknelpunten kunnen zijn vanwege een combinatie van hoog aantal aanroepen en/of prestatieproblemen.
Functies Weergave van de CPU-tijd die in afzonderlijke functies is besteed, geaggregeerd over de periode van gegevensverzameling. Wordt gebruikt om functies te identificeren die prestatieknelpunten kunnen zijn vanwege een combinatie van hoog aantal aanroepen en/of prestatieproblemen.
Vlamgrafiek Hiërarchische weergave van het functieaanroeppad in een visualisatie van een vlamgrafiek. Wordt gebruikt om oproeppaden te identificeren die de meeste CPU-tijd (dynamisch pad) gebruiken.

Als u het rapport wilt analyseren, klikt u op Gedetailleerd rapportmaken.

Het rapport biedt verschillende weergaven van de diagnostische gegevens:

  • Beller/gebeld
  • Oproepstructuur

In alle weergaven, met uitzondering van beller/gebelde, wordt het diagnostische rapport gesorteerd op Totale CPU, van hoog naar laag. Wijzig de sorteervolgorde of sorteer kolom door de kolomkoppen te kiezen. U kunt dubbelklikken op een functie waarin u geïnteresseerd bent, en u ziet de bron voor de functie en het markeren van de plaats waar de tijd in die functie wordt besteed. De tabel bevat kolommen met gegevens, zoals de tijd die in de functie is besteed, inclusief aangeroepen functies (Totale CPU) en een tweede kolom met de tijd die in een functie is besteed, met uitzondering van aangeroepen functies (self-CPU).

Met deze gegevens kunt u beoordelen of de functie zelf een prestatieknelpunt is. Bepaal hoeveel gegevens de methode weergeeft om te zien of code- of runtimebibliotheken van derden de reden zijn waarom uw eindpunten traag of intensief resourceverbruik hebben.

Zie Dynamische paden identificeren met Flame Graphvoor meer informatie over het gebruik van de Vlamgrafiek.

Structuur van cpu-gebruiksoproep

Als u de oproepstructuur wilt weergeven, selecteert u het bovenliggende knooppunt in het rapport. Standaard wordt de pagina CPU-gebruik geopend in de weergave Beller/Callee. Selecteer in de vervolgkeuzelijst Huidige weergaveOproepstructuur.

U kunt klikken op de knoppen Dynamisch pad uitvouwen en Hot Path weergeven knoppen om de functieaanroepen te zien die het hoogste percentage van de CPU gebruiken in de aanroepstructuurweergave.

Belboomstructuur

Schermopname met oproepboomstructuur.

Schermopname met oproepboomstructuur.

Beeld Beschrijving
stap 1 Het knooppunt op het hoogste niveau in de aanroepstructuur voor CPU-gebruik, die de toepassing vertegenwoordigt.
stap 2 Wanneer in de meeste apps de optie Externe code weergeven is uitgeschakeld, is het knooppunt op het tweede niveau een [externe code] knooppunt. Het knooppunt bevat de systeem- en frameworkcode die de app start en stopt, de gebruikersinterface tekent, threadplanning regelt en andere services op laag niveau aan de app levert.
stap 3 De kinderen van het tweedegraads knooppunt zijn de gebruikerscodemethoden en asynchrone routines die door de systeem- en frameworkcode van het tweede niveau worden aangeroepen of gecreëerd.
stap 4 Onderliggende knooppunten van een methode bevatten alleen gegevens voor de aanroepen van de bovenliggende methode. Wanneer Externe code weergeven is uitgeschakeld, kunnen app-methoden ook een [externe code] knooppunt bevatten.

Externe code

Systeem- en frameworkfuncties die door uw code worden uitgevoerd, worden externe codegenoemd. Externe codefuncties starten en stoppen de app, tekenen de gebruikersinterface, beheren threading en bieden andere laag-niveau services aan de app. In de meeste gevallen bent u niet geïnteresseerd in externe code, dus de aanroepstructuur voor CPU-gebruik verzamelt de externe functies van een gebruikersmethode in één [externe aanroep] knooppunt.

Als u de aanroeppaden van externe code wilt weergeven, schakelt u op de overzichtspagina van het hoofdrapport (rechterdeelvenster) de optie Just My Code weergeven uit in het dropdownmenu Instellingen en selecteert u vervolgens Toepassen. (De vervolgkeuzelijst Instellingen is beschikbaar op de overzichtspagina van het hoofdrapport, niet op de gedetailleerde weergaven.)

Schermopname met Instellingen en vervolgens Alleen mijn code weergeven.

Systeem- en frameworkfuncties die door uw code worden uitgevoerd, worden externe codegenoemd. Externe codefuncties starten en stoppen de app, tekenen de gebruikersinterface, beheren threading en bieden andere laag-niveau services aan de app. In de meeste gevallen bent u niet geïnteresseerd in externe code, dus de aanroepstructuur voor CPU-gebruik verzamelt de externe functies van een gebruikersmethode in één [Externe code] knooppunt.

Als u de aanroeppaden van externe code wilt weergeven, selecteert u op de hoofdpagina van het diagnostische rapport (rechterdeelvenster) Externe code weergeven in de vervolgkeuzelijst Filter en selecteert u vervolgens Toepassen. De aanroepstructuur weergave van de CPU-gebruikspagina breidt vervolgens de externe codeaanroepen uit. (De vervolgkeuzelijst Filter is beschikbaar op de hoofddiagnosepagina, niet op de gedetailleerde weergaven.)

schermopname met Externe code weergeven.

Wanneer u Alleen mijn code weergevenuitschakelt, worden met de aanroepstructuur weergave van het CPU-gebruik pagina de externe codeaanroepen uitgevouwen.

Veel aanroepketens van externe code zijn diep genest, zodat de breedte van de keten de weergavebreedte van de functienaam kolom kan overschrijden. De functienamen worden vervolgens weergegeven zoals weergegeven in de volgende afbeelding.

Schermopname die geneste externe code in de aanroepstructuur toont.

Veel aanroepketens van externe code zijn diep genest, zodat de breedte van de keten de weergavebreedte van de functienaam kolom kan overschrijden. De functienamen worden vervolgens weergegeven als ....

Schermopname die geneste externe code in de aanroepstructuur toont.

Gebruik het zoekvak om een functienaam te vinden die u zoekt. Beweeg de muisaanwijzer over de geselecteerde lijn of gebruik de horizontale schuifbalk om de gegevens weer te geven.

Schermafbeelding die Zoeken naar geneste externe code toont.

Schermafbeelding die Zoeken naar geneste externe code toont.

Asynchrone functies in de aanroepstructuur voor CPU-gebruik

Wanneer de compiler een asynchrone methode tegenkomt, wordt er een verborgen klasse gemaakt om de uitvoering van de methode te beheren. Conceptueel is de klasse een statusmachine. De klasse heeft door compiler gegenereerde functies die asynchroon de oorspronkelijke methoden aanroepen, en de callbacks, scheduler en iterators die nodig zijn om ze uit te voeren. Wanneer een bovenliggende methode de oorspronkelijke methode aanroept, verwijdert de compiler de methode uit de uitvoeringscontext van het bovenliggende element en voert de verborgen klassemethoden uit in de context van de systeem- en frameworkcode waarmee de uitvoering van apps wordt beheerd. De asynchrone methoden zijn vaak, maar niet altijd, uitgevoerd op een of meer verschillende threads. Deze code verschijnt in de CPU-gebruik aanroepstructuur als kinderen van het [externe code] knooppunt direct onder de topknoop van de structuur.

In het volgende voorbeeld zijn de eerste twee knooppunten onder [Externe code] de door de compiler gegenereerde methoden van de statusmachineklasse. Het derde knooppunt is de aanroep naar de oorspronkelijke methode.

Schermopname van het Asynchrone knooppunt.

Vouw de gegenereerde methoden uit om weer te geven wat er gebeurt:

Schermopname met uitgevouwen asynchrone knooppunten.

Schermopname met uitgevouwen asynchrone knooppunten.

  • MainPage::GetMaxNumberAsyncButton_Click alleen een lijst met taakwaarden beheert, het maximum van de resultaten berekent en de uitvoer weergeeft.

  • MainPage+<GetMaxNumberAsyncButton_Click>d__3::MoveNext toont u de activiteit die is vereist voor het plannen en starten van de 48 taken waarmee de aanroep naar GetNumberAsyncwordt verpakt.

  • MainPage::<GetNumberAsync>b__b toont de activiteit van de taken die GetNumberaanroepen.

Aantal oproepen verzamelen (.NET)

Als u het aantal aanroepen wilt weergeven in de functieweergave, kunt u de instelling inschakelen voordat u de profiler start. Deze instelling wordt ondersteund voor .NET-projecttypen en vereist het starten van het proces onder de profiler. Het bijlagescenario wordt niet ondersteund.

  1. Selecteer het -pictogram Instellingen voor CPU-gebruik in de performance profiler.

    Schermopname met het pictogram Instellingen voor CPU-gebruik.

  2. Schakel de optie Aantal oproepen verzamelen (alleen.NET) in.

    schermopname met instellingen voor CPU-gebruik.

  3. Cpu-gebruiksgegevens verzamelen.

  4. Open de functieweergave en controleer of de kolom Aantal oproepen is ingesteld op zichtbaar.

    Als u de kolom niet ziet, klikt u met de rechtermuisknop op een kolomkop om zichtbare kolommen te kiezen.

    Schermopname van het aantal oproepen.