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 di tempo di calcolo impiegato per l'esecuzione del codice in C++, C#/Visual Basic.
Lo strumento Utilizzo CPU consente di:
Diagnostica 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 vengono inviate al sito Web di vendita 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 per restringere la posizione in cui ottimizzare.
Lo strumento utilizzo della 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+F2e quindi scegliendo utilizzo CPUoppure aprendo una traccia già raccolta usando uno strumento come dotnet-trace o dotnet-monitor. Per il codice di produzione .NET, questo è molto probabilmente il modo in cui si raccoglierebbero 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 nelle build di rilascio o debug. Per altre informazioni, vedere Utilizzare strumenti di profilazione nelle build di rilascio o di debug.
Le istruzioni seguenti illustrano come usare lo strumento Utilizzo CPU senza il debugger, usando Visual Studio Performance Profiler. Gli esempi usano una versione di rilascio su un computer locale. Le build di versione offrono la migliore visualizzazione delle prestazioni effettive dell'app. Per un'esercitazione che illustra come migliorare le prestazioni usando lo strumento Utilizzo CPU, vedere Studio di caso: Guida per principianti all'ottimizzazione del codice.
In genere, il computer locale replica meglio l'esecuzione dell'app installata. Per raccogliere dati da un dispositivo remoto, eseguire l'app direttamente nel dispositivo, non tramite una connessione Desktop remoto.
Raccogliere i dati di utilizzo della CPU
Nel progetto di Visual Studio, impostare la configurazione della soluzione su Release e selezionare Debugger locale di Windows (o Computer locale) come destinazione di distribuzione.
Selezionare Debug>Profiler di Prestazioni.
In Strumenti disponibili, selezionare Uso della CPU, e quindi selezionare Avvia.
utilizzo CPU
utilizzo CPU
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 della 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. Quando hai finito di raccogliere i dati, seleziona Interrompi raccolta.
Lo strumento Utilizzo CPU analizza i dati e visualizza il report. Se si verificano problemi durante la raccolta o la visualizzazione dei dati, vedere Risolvere gli errori di profilazione e correggere i problemi.
Usare l'elenco a discesa filtro per selezionare o deselezionare i thread da visualizzare e usare la casella Cerca 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. Questo è diverso dal grafico della sequenza temporale dell'utilizzo CPU , che confronta l'attività totale della CPU in un intervallo di tempo con la CPU totale disponibile. |
Self CPU [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 nella sezione top insights vengono visualizzate informazioni dettagliate, usare il collegamento fornito per ottenere altre informazioni sul problema identificato. Inoltre, se si usa Copilot, il pulsante Chiedi Copilot aprirà la finestra di chat di Copilot e Copilot fornirà suggerimenti in base al codice e a eventuali problemi identificati.
Per ulteriori informazioni, vedere approfondimenti sulla CPU.
Analizzare l'utilizzo della CPU
Per analizzare il report Utilizzo CPU, fare clic su Apri dettaglioppure fare clic su una delle funzioni principali per aprire la visualizzazione Funzioni.
Il report fornisce visualizzazioni diverse dei dati di diagnostica:
Visualizza | Descrizione |
---|---|
Chiamante/chiamato | Visualizzazione dettagliata del tempo della CPU per una funzione specifica, le funzioni che l'hanno chiamata e le funzioni da essa chiamate. I dati sulle prestazioni vengono aggregati per il periodo di raccolta dati. È possibile selezionare le funzioni chiamante e le funzioni chiamate per esplorare il percorso di chiamata. |
Albero delle chiamate | Visualizzazione gerarchica del percorso della chiamata di funzione. Usato per identificare i percorsi di chiamata che richiedono la maggior parte del tempo cpu (percorso critico). |
Moduli | Visualizzazione del tempo di CPU impiegato in singoli moduli, aggregati nel periodo di raccolta dei dati. Usato per identificare i moduli che potrebbero essere colli di bottiglia delle prestazioni a causa di una combinazione di numero elevato di chiamate e/o problemi di prestazioni. |
Funzioni | Visualizzazione del tempo di CPU impiegato in singole funzioni, aggregate nel periodo di raccolta dei dati. Usato per identificare le funzioni che potrebbero diventare colli di bottiglia a causa di un numero elevato di chiamate e/o di problemi prestazionali. |
Grafico di fiamma | Visualizzazione gerarchica del percorso di chiamata di funzione in un grafico a fiamma. Usato per identificare i percorsi di chiamata che richiedono la maggior parte del tempo cpu (percorso critico). |
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 a CPU totale, dal più alto al più basso. Modificare l'ordine di ordinamento o la colonna di ordinamento selezionando i titoli delle colonne. È 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. Nel menu a tendina Visualizzazione corrente, seleziona 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 è disabilitata, il nodo di secondo livello è un nodo [Codice esterno]. Il nodo contiene il codice di sistema e framework che avvia e arresta l'app, disegna l'interfaccia utente, controlla la pianificazione dei thread e fornisce altri servizi di basso livello all'app. |
![]() |
Gli elementi figlio del nodo di secondo livello sono i metodi di codice utente e le routine asincrone chiamate o create dal sistema di secondo livello e dal codice framework. |
![]() |
I nodi figlio di un metodo dispongono di dati solo per le chiamate del metodo padre. Quando Mostra Codice Esterno è disabilitato, anche i metodi dell'app possono contenere un nodo [Codice Esterno]. |
Codice esterno
Le funzioni di sistema e framework che sono eseguite dal tuo codice vengono chiamate codice esterno. Le funzioni di codice esterno avviano e arrestano l'app, disegnano l'interfaccia utente, controllano il threading e forniscono 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 unico 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. Il menu a tendina delle impostazioni è disponibile nella pagina principale del riepilogo del report, non nelle visualizzazioni dettagliate.
Le funzioni di sistema e framework che sono eseguite dal tuo codice vengono chiamate codice esterno. Le funzioni di codice esterno avviano e arrestano l'app, disegnano l'interfaccia utente, controllano il threading e forniscono 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 unico nodo [Codice esterno].
Per visualizzare i percorsi di chiamata del codice esterno, nella pagina principale del report di diagnostica (riquadro destro), selezionare Mostra codice esterno dall'elenco a discesa Filtro e quindi selezionare Applica. La visualizzazione albero delle chiamate della pagina utilizzo CPU espande quindi le chiamate di codice esterno. L'elenco a discesa Filtro è disponibile nella pagina principale della diagnostica, non nelle visualizzazioni dettagliate.
Quando si disabilita MostraJust My Code, la visualizzazione Albero delle chiamate della pagina utilizzo CPU espande le chiamate di codice esterno.
Molte catene di chiamate di codice esterno sono annidate in modo profondo, quindi 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.
Molte catene di chiamate di codice esterno sono annidate in modo profondo, quindi la larghezza della catena può superare la larghezza di visualizzazione della colonna Nome funzione. I nomi delle funzioni vengono quindi visualizzati come ....
Per trovare un nome di funzione che si sta cercando, usare la casella di ricerca. Passare il puntatore del mouse sulla riga selezionata o 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. Concettualmente, la classe è una macchina a stati. La classe dispone di funzioni generate automaticamente dal compilatore che chiamano in modo asincrono i metodi originali, insieme ai callback, all'utilità di pianificazione e agli iteratori necessari per eseguirli. Quando un metodo padre chiama il metodo originale, il compilatore rimuove il metodo dal contesto di esecuzione dell'elemento padre ed esegue i metodi di classe nascosti nel contesto del sistema e del codice framework che controlla l'esecuzione dell'app. I metodi asincroni sono spesso, ma non sempre, eseguiti su uno o più thread diversi. Questo codice viene visualizzato nell'albero delle chiamate utilizzo CPU, come elementi figli del nodo [Codice esterno] immediatamente sotto il nodo superiore dell'albero.
Nell'esempio seguente i primi due nodi in [Codice esterno] sono i metodi generati dal compilatore della classe della macchina a stati. Il terzo nodo è la chiamata al metodo originale.
nodo asincrono
Espandi i metodi generati per mostrare cosa sta succedendo.
nodo asincrono espanso
nodo asincrono espanso
MainPage::GetMaxNumberAsyncButton_Click
gestisce solo un elenco dei valori dell'attività, calcola il massimo dei risultati e visualizza l'output.MainPage+<GetMaxNumberAsyncButton_Click>d__3::MoveNext
mostra l'azione necessaria per pianificare e avviare le 48 attività che gestiscono la chiamata aGetNumberAsync
.MainPage::<GetNumberAsync>b__b
mostra l'attività dei compiti 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 l'Utilizzo della CPU nel Profiler delle 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.