Analizzare le prestazioni usando la profilatura della CPU nel profiler prestazioni (C#, Visual Basic, C++, F#)
Un buon modo per iniziare a analizzare i problemi di prestazioni nell'app consiste nel comprendere l'utilizzo della CPU usando un profiler cpu. Lo strumento prestazioni Utilizzo CPU di Visual Studio mostra il tempo di calcolo attivo della CPU e la percentuale impiegato per l'esecuzione del codice in C++, C#/Visual Basic.
Lo strumento Utilizzo CPU consente di:
Diagnosticare un rallentamento o un blocco del processo nella codebase del team. Lo strumento consente di diagnosticare il problema con il codice di produzione del team. Fornisce informazioni dettagliate automatiche e diverse visualizzazioni dei dati in modo da poter analizzare e diagnosticare i problemi di prestazioni.
Identificare i problemi di prestazioni negli scenari DevOps, ad esempio, lo strumento può aiutare quando un cliente segnala che alcune richieste o ordini non passano al sito Web al dettaglio durante la stagione di punta. Spesso, i problemi si trovano nell'ambiente di produzione ed è difficile eseguire il debug in quel momento, ma questo strumento consente di acquisire informazioni e prove sufficienti del problema. Dopo aver raccolto un file di traccia, l'analisi può aiutare rapidamente a comprendere le possibili cause e fornire suggerimenti all'interno del contesto del codice in modo da poter eseguire i passaggi successivi per risolvere il problema.
Verificare l'utilizzo elevato della CPU Se il problema di latenza non si trova all'interno di una richiesta API, è possibile verificare l'utilizzo elevato della CPU e altri problemi correlati con lo strumento Utilizzo CPU. Lo strumento Utilizzo CPU consente di identificare i colli di bottiglia in modo da limitare la posizione in cui ottimizzare.
Lo strumento Utilizzo CPU è utile sia per le sessioni di traccia locali che per la produzione. È possibile eseguire lo strumento Utilizzo CPU usando i tasti di scelta rapida ALT+F2 e quindi scegliendo Utilizzo CPU oppure aprendo una traccia già raccolta usando uno strumento come dotnet-trace o dotnet-monitor. Per il codice di produzione .NET, è molto probabile come raccogliere le tracce.
È possibile eseguire lo strumento Utilizzo CPU in un progetto di Visual Studio aperto, in un'app di Microsoft Store installata o collegata a un'app o a un processo in esecuzione. È possibile eseguire lo strumento Utilizzo CPU con o senza il debug. Per altre informazioni, vedere Eseguire gli strumenti di profilatura con o senza il debugger.
Le istruzioni seguenti illustrano come usare lo strumento Utilizzo CPU senza il debugger, con Profiler prestazioni di Visual Studio. L'esempio usa una build di rilascio in un computer locale. Le build di rilascio offrono la migliore visualizzazione delle prestazioni effettive dell'app. Per un'esercitazione che illustra come migliorare le prestazioni usando lo strumento Utilizzo CPU, vedere Case study: Guida per principianti all'ottimizzazione del codice.
In genere il computer locale replica in modo ottimale l'esecuzione dell'app installata. Per raccogliere dati da un dispositivo remoto, eseguire l'app direttamente nel dispositivo e non tramite una connessione Desktop remoto.
Raccogliere i dati di utilizzo della CPU
Nel progetto di Visual Studio impostare la configurazione della soluzione su Rilascio e selezionare Debugger Windows locale (o Computer locale) come destinazione di distribuzione.
Selezionare Debug>Profiler prestazioni.
In Strumenti disponibili selezionare Utilizzo CPU e quindi selezionare Avvia.
Se si abilita l'opzione Avvia con raccolta sospesa prima di avviare il profiler, i dati non verranno raccolti finché non si seleziona il pulsante Registra nella visualizzazione sessione di diagnostica.
Nota
Per altre informazioni su come rendere lo strumento più efficiente, vedere Ottimizzazione delle impostazioni del profiler.
Dopo l'avvio dell'app, la sessione di diagnostica inizia e visualizza i dati di utilizzo della CPU. Dopo aver completato la raccolta dei dati, selezionare Arresta raccolta.
Lo strumento Utilizzo CPU analizza i dati e visualizza il report. In caso di problemi durante la raccolta o la visualizzazione dei dati, vedere Risolvere gli errori di profilatura e risolvere i problemi.
Usare l'elenco a discesa Filtro per selezionare o deselezionare i thread da visualizzare e usare la casella Ricerca per cercare un thread o un nodo specifico.
Colonne di dati di utilizzo della CPU
Nome | Descrizione |
---|---|
CPU totale [unità, %] | I millisecondi del tempo di calcolo della CPU e la percentuale di CPU usata dalle chiamate alla funzione e le funzioni chiamate dalla funzione, nell'intervallo di tempo selezionato. Il valore è diverso da quello del grafico della sequenza temporale di Utilizzo CPU, che confronta l'attività CPU totale dell'app in un intervallo di tempo con la capacità CPU disponibile totale. |
CPU auto [unità, %] | I millisecondi del tempo di calcolo della CPU e la percentuale di CPU usata dalle chiamate alla funzione nell'intervallo di tempo selezionato, escluse le funzioni chiamate dalla funzione. |
Modulo | In alcune visualizzazioni viene visualizzata la colonna Module, che mostra il nome del modulo contenente la funzione. |
Analizzare le informazioni dettagliate sulla CPU
Se vengono visualizzate informazioni dettagliate nella sezione Informazioni dettagliate principali, usare il collegamento fornito per ottenere altre informazioni sul problema identificato. Inoltre, se si usa Copilot, il pulsante Ask Copilot aprirà la finestra di chat di Copilot e Copilot fornirà suggerimenti in base al codice e a eventuali problemi identificati.
Per altre informazioni, vedere Informazioni dettagliate sulla CPU.
Analizzare l'utilizzo della CPU
Per analizzare il report Utilizzo CPU, fare clic su Apri dettagli oppure fare clic su una delle funzioni principali per aprire la visualizzazione Funzioni .
Il report fornisce visualizzazioni diverse dei dati di diagnostica:
- Chiamante/chiamato
- Albero delle chiamate
- moduli
- Funzioni
- Grafico di fiamma
Per analizzare il report, fare clic su Crea report dettagliato.
Il report fornisce visualizzazioni diverse dei dati di diagnostica:
- Chiamante/chiamato
- Albero delle chiamate
In tutte le visualizzazioni, ad eccezione del chiamante/chiamato, il report di diagnostica viene ordinato in base alla CPU totale, dal più alto al più basso. Per modificare l'ordinamento o la colonna di ordinamento, selezionare le intestazioni di colonna. È possibile fare doppio clic su una funzione a cui si è interessati e verrà visualizzata l'origine per la funzione, nonché l'evidenziazione che mostra dove viene impiegato il tempo in tale funzione. La tabella mostra le colonne con dati, ad esempio il tempo impiegato nella funzione, incluse le funzioni chiamate (CPU totale) e una seconda colonna che mostra il tempo impiegato in una funzione, escludendo le funzioni chiamate (CPU self).
Questi dati consentono di valutare se la funzione stessa è un collo di bottiglia delle prestazioni. Determinare la quantità di dati visualizzati dal metodo per verificare se il codice o le librerie di runtime di terze parti sono il motivo per cui gli endpoint sono lenti o a consumo elevato delle risorse.
Per altre informazioni sull'uso del grafico Flame, vedere Identificare i percorsi caldi con Flame Graph.
Albero delle chiamate utilizzo CPU
Per visualizzare l'albero delle chiamate, selezionare il nodo padre nel report. Per impostazione predefinita, la pagina Utilizzo CPU viene visualizzata nella visualizzazione Chiamante/chiamato . Nell'elenco a discesa Visualizzazione corrente selezionare Albero delle chiamate.
È possibile fare clic sui pulsanti Espandi percorso critico e Mostra percorso critico per visualizzare le chiamate di funzione che usano la percentuale più alta della CPU nella visualizzazione albero delle chiamate.
Struttura dell'albero delle chiamate
Immagine | Descrizione |
---|---|
Nodo di primo livello nell'albero delle chiamate Utilizzo CPU, che rappresenta l'applicazione. | |
Nella maggior parte delle app, quando l'opzione Mostra codice esterno opzione è disabilitata il nodo di secondo livello è un nodo [Codice esterno]. Il nodo contiene il codice di sistema e di framework che avvia e arresta l'app, disegna l'interfaccia utente, controlla la pianificazione dei thread e offre altri servizi di basso livello all'app. | |
Gli elementi figlio del nodo di secondo livello sono i metodi del codice utente e le routine asincrone che vengono chiamati o creati dal codice di sistema o di framework di secondo livello. | |
I nodi figlio di un metodo contengono dati solo per le chiamate del metodo padre. Quando l'opzione Mostra codice esterno è disabilitata, i metodi dell'app possono contenere anche un nodo [Codice esterno] . |
Codice esterno
Le funzioni di sistema e framework eseguite dal codice sono dette codice esterno. Le funzioni codice esterno avviano e arrestano l'app, disegnano l'interfaccia utente, controllano il threading e offre altri servizi di basso livello all'app. Nella maggior parte dei casi, non si è interessati al codice esterno, quindi l'albero delle chiamate Utilizzo CPU raccoglie le funzioni esterne di un metodo utente in un nodo [Chiamata esterna].
Per visualizzare i percorsi di chiamata del codice esterno, nella pagina di riepilogo principale del report (riquadro destro), deselezionare Mostra just my code dall'elenco a discesa Impostazioni e quindi selezionare Applica. (L'oggetto L'elenco a discesa Impostazioni è disponibile nella pagina principale di riepilogo del report, non nelle visualizzazioni dettagliate.
Le funzioni di sistema e framework eseguite dal codice sono dette codice esterno. Le funzioni codice esterno avviano e arrestano l'app, disegnano l'interfaccia utente, controllano il threading e offre altri servizi di basso livello all'app. Nella maggior parte dei casi il codice esterno non risulta interessante, pertanto l'albero delle chiamate di Utilizzo CPU raccoglie le funzioni esterne di un metodo utente in un unico nodo [Codice esterno].
Per visualizzare i percorsi delle chiamate di codice esterno, nella pagina del report di diagnostica principale (riquadro destro) selezionare Mostra codice esterno nell'elenco a discesa Filtro e quindi selezionare Applica. La visualizzazione Albero delle chiamate della pagina Utilizzo CPU espande le chiamate al codice esterno. L'elenco a discesa Filtro è disponibile nella pagina di diagnostica principale, non nelle visualizzazioni dettagliate.
Quando si disabilita Mostra just my code, la visualizzazione Albero delle chiamate della pagina Utilizzo CPU espande le chiamate di codice esterno.
Numerose catene di chiamate del codice esterno sono annidate in profondità, pertanto la larghezza della catena può superare la larghezza di visualizzazione della colonna Nome funzione. I nomi delle funzioni vengono quindi visualizzati come illustrato nell'immagine seguente.
Numerose catene di chiamate del codice esterno sono annidate in profondità, pertanto la larghezza della catena può superare la larghezza di visualizzazione della colonna Nome funzione. In questo caso i nomi delle funzioni vengono visualizzati come ....
Per trovare il nome di una funzione, usare la casella di ricerca. Passare il mouse sopra la riga selezionata oppure usare la barra di scorrimento orizzontale per visualizzare i dati.
Funzioni asincrone nell'albero delle chiamate di utilizzo della CPU
Quando il compilatore rileva un metodo asincrono, crea una classe nascosta per controllare l'esecuzione del metodo. A livello concettuale la classe è una macchina a stati. La classe dispone di funzioni generate dal compilatore che chiamano in modo asincrono i metodi originali e i callback, l'utilità di pianificazione e gli iteratori necessari per la loro esecuzione. Quando un metodo padre chiama il metodo originale, il compilatore rimuove il metodo dal contesto di esecuzione del metodo padre ed esegue i metodi della classe nascosta nel contesto del codice di sistema e di framework che controlla l'esecuzione dell'app. Spesso, ma non sempre, i metodi asincroni vengono eseguiti in uno o più thread diversi. Il codice è visualizzato nell'albero delle chiamate Utilizzo CPU come figlio del nodo [Codice esterno] immediatamente sotto il nodo principale dell'albero.
Nell'esempio seguente i primi due nodi sotto [Codice esterno] sono i metodi generati dal compilatore della classe macchina a stati. Il terzo nodo è la chiamata al metodo originale.
Espandere i metodi generati per vedere che cosa accade:
MainPage::GetMaxNumberAsyncButton_Click
si limita a gestire un elenco dei valori delle attività, a calcolare il massimo dei risultati e a visualizzare l'output.MainPage+<GetMaxNumberAsyncButton_Click>d__3::MoveNext
mostra l'attività necessaria per pianificare e avviare le 48 attività che eseguono il wrapping della chiamata aGetNumberAsync
.MainPage::<GetNumberAsync>b__b
visualizza le operazioni eseguite dalle attività che chiamanoGetNumber
.
Raccogliere i conteggi delle chiamate (.NET)
Se si desidera visualizzare i conteggi delle chiamate nella visualizzazione Funzioni, è possibile abilitare l'impostazione prima di avviare il profiler. Questa impostazione è supportata per i tipi di progetto .NET e richiede l'avvio del processo nel profiler. Lo scenario di collegamento non è supportato.
Selezionare l'icona Impostazioni per Utilizzo CPU in Profiler prestazioni.
Abilitare l'opzione Raccogli conteggi chiamate (solo.NET).
Raccogliere i dati di utilizzo della CPU.
Aprire la visualizzazione Funzioni e quindi assicurarsi che la colonna Conteggio chiamate sia impostata su visibile.
Se la colonna non viene visualizzata, fare clic con il pulsante destro del mouse su un'intestazione di colonna per scegliere le colonne visibili.