Misurare le prestazioni dell'applicazione analizzando l'utilizzo della CPU (C#, Visual Basic, C++, F#)
Trova i problemi di prestazioni mentre esegui il debug con il debugger integrato nello strumento diagnostico per l'uso della CPU. È anche possibile analizzare l'utilizzo della CPU senza un debugger collegato o specificando come destinazione un'app in esecuzione. Per altre informazioni, vedere Eseguire gli strumenti di profilatura nelle build di rilascio o di debug e Analizzare le prestazioni usando la profilatura della CPU.
Quando il debugger è in pausa, lo strumento d'uso della CPU nella finestra degli Strumenti di diagnostica raccoglie informazioni sulle funzioni in esecuzione nella tua applicazione. Lo strumento elenca le funzioni che eseguono il lavoro e fornisce un grafico della sequenza temporale che è possibile usare per concentrarsi su segmenti specifici della sessione di campionamento.
Importante
Gli strumenti di diagnostica integrati nel debugger sono supportati per lo sviluppo .NET in Visual Studio, tra cui ASP.NET, ASP.NET Core e per lo sviluppo nativo/C++. È richiesto il carico di lavoro corrispondente per Visual Studio. Windows 8 e versioni successive sono necessari per eseguire gli strumenti di profilatura con il debugger (finestra strumenti di diagnostica).
In questa esercitazione si eseguiranno le seguenti attività:
- Raccogliere i dati di utilizzo della CPU
- Analizzare i dati di utilizzo della CPU
Passaggio 1: Raccogliere i dati di utilizzo della CPU
Aprire il progetto di cui si vuole eseguire il debug in Visual Studio e impostare un punto di interruzione nell'app nel punto in cui si vuole esaminare l'utilizzo della CPU.
Impostare un secondo punto di interruzione alla fine della funzione o dell'area del codice da analizzare.
Impostando due punti di interruzione, è possibile limitare la raccolta dei dati alle parti del codice da analizzare.
La finestra Strumenti di diagnostica viene visualizzata automaticamente a meno che non sia stata disattivata. Per visualizzare di nuovo la finestra, fare clic su Debug>Windows>Mostra strumenti di diagnostica.
È possibile scegliere se visualizzare utilizzo CPU, Utilizzo memoriao entrambi, con l'impostazione Seleziona strumenti sulla barra degli strumenti. Se si esegue Visual Studio Enterprise, è anche possibile abilitare o disabilitare IntelliTrace in strumenti di opzioni>>IntelliTrace.
Si esaminerà principalmente l'utilizzo della CPU, quindi verifica che Utilizzo CPU sia abilitato (è abilitato per impostazione predefinita).
Fare clic su Debug>Avvia debug (oppure Start sulla barra degli strumenti, oppure F5).
Al termine del caricamento dell'app, viene visualizzata la visualizzazione Riepilogo degli strumenti di diagnostica. Se è necessario aprire la finestra, fare clic su Debug>Windows>Mostra strumenti di diagnostica.
Per altre informazioni sugli eventi, vedere Ricerca e filtro della scheda Eventi della finestra Strumenti di diagnostica.
Esegui lo scenario che farà scattare il primo punto di interruzione.
Mentre il debugger è in pausa, abilita la raccolta dei dati sull'utilizzo della CPU e quindi apri la scheda Utilizzo della CPU.
Quando si sceglie Registra profilo CPU, Visual Studio inizierà a registrare le funzioni e il tempo necessario per l'esecuzione. È possibile visualizzare questi dati raccolti solo quando l'applicazione viene interrotta in corrispondenza di un punto di interruzione.
Premere F5 per eseguire l'app al secondo punto di interruzione.
A questo punto sono disponibili dati sulle prestazioni per l'applicazione specificamente per l'area di codice eseguita tra i due punti di interruzione.
Il profiler inizia a preparare i dati del thread. Attendere il completamento.
Lo strumento Utilizzo CPU visualizza il report nella scheda Utilizzo CPU.
Se si vuole selezionare un'area di codice più specifica da analizzare, selezionare un'area nella sequenza temporale della CPU (deve essere un'area che mostra i dati di profilatura).
A questo punto, è possibile iniziare ad analizzare i dati. Se hai problemi nella raccolta o nella visualizzazione dei dati, vedi Risolvere gli errori di profilazione e risolvere i problemi.
Suggerimento
Quando si tenta di identificare i problemi di prestazioni, eseguire più misurazioni. Le prestazioni variano naturalmente da run-to-run e i percorsi di codice vengono in genere eseguiti più lentamente alla prima esecuzione a causa del lavoro di inizializzazione monouso, ad esempio il caricamento di DLL, i metodi di compilazione JIT e l'inizializzazione delle cache. Prendendo più misurazioni, si ottiene un'idea migliore dell'intervallo e della median della metrica visualizzata, che consente di confrontare la prima volta rispetto alle prestazioni dello stato stabile di un'area di codice.
Passaggio 2: Analizzare i dati di utilizzo della CPU
È consigliabile iniziare ad analizzare i dati esaminando l'elenco di funzioni in Utilizzo CPU, identificando le funzioni che eseguono il maggior lavoro e quindi esaminando in modo più approfondito ognuno di essi.
Nell'elenco delle funzioni esaminare le funzioni che eseguono il maggior numero di operazioni.
Suggerimento
Le funzioni sono elencate in ordine a partire da quelle che eseguono il maggior numero di operazioni (non sono in ordine di chiamata). In questo modo è possibile identificare rapidamente le funzioni con esecuzione più lunga.
Nell'elenco delle funzioni fare doppio clic su una delle funzioni dell'app che esegue molte operazioni.
Quando si fa doppio clic su una funzione, la vista funzioni viene aperta nel riquadro sinistro. Selezionare la visualizzazione chiamante e chiamato dal menu a discesa.
In questa visualizzazione, la funzione selezionata viene mostrata nell'intestazione e nella casella Funzione Corrente (DoWork, in questo esempio). La funzione che ha chiamato la funzione corrente viene visualizzata a sinistra sotto Funzioni chiamanti, e tutte le funzioni chiamate dalla funzione corrente vengono visualizzate nella casella Funzioni chiamate a destra. È possibile selezionare una delle due caselle per modificare la funzione corrente.
Questa visualizzazione mostra il tempo totale (ms) e la percentuale del tempo di esecuzione complessivo dell'app che la funzione ha impiegato per completare. Corpo della Funzione mostra anche la quantità totale di tempo (e la percentuale di tempo) impiegata nel corpo della funzione, escludendo il tempo impiegato per le funzioni di chiamata e chiamate.
Quando si fa doppio clic su una funzione, la visualizzazione chiamante/chiamato si apre nel riquadro sinistro.
In questa visualizzazione, la funzione selezionata viene visualizzata nell'intestazione e nella casella funzione corrente (GetNumber, in questo esempio). La funzione che ha chiamato la funzione corrente viene visualizzata a sinistra sotto Funzioni chiamanti, e tutte le funzioni chiamate dalla funzione corrente vengono visualizzate nella casella Funzioni chiamate a destra. È possibile selezionare una delle due caselle per modificare la funzione corrente.
Questa visualizzazione mostra il tempo totale (ms) e la percentuale del tempo di esecuzione complessivo dell'app che la funzione ha impiegato per completare. Corpo della Funzione mostra anche la quantità totale di tempo (e la percentuale di tempo) impiegata nel corpo della funzione, escludendo il tempo impiegato per le funzioni di chiamata e chiamate. In questo esempio sono stati spesi 2367 su 2389 ms nel corpo della funzione e i rimanenti 22 ms sono stati spesi nel codice esterno chiamato da questa funzione.
Suggerimento
Valori elevati nella Funzione Corpo possono indicare un collo di bottiglia delle prestazioni all'interno della funzione stessa.
Per visualizzare una visualizzazione di livello superiore che mostra l'ordine in cui vengono chiamate le funzioni, selezionare Albero delle chiamate dall'elenco a discesa nella parte superiore del riquadro.
Ogni area numerata nella figura è correlata a un passaggio della procedura.
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] che 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 contengono dati solo per le chiamate del metodo padre. Quando Mostra Codice Esterno è disabilitato, i metodi dell'app possono contenere anche un nodo [Codice Esterno]. Di seguito sono riportate altre informazioni sui valori delle colonne:
cpu totale indica la quantità di lavoro eseguita dalla funzione e dalle funzioni chiamate da essa. I valori totali elevati della CPU puntano alle funzioni che sono più costose complessivamente.
self CPU indica quanto lavoro è stato eseguito dal codice nel corpo della funzione, escluso il lavoro eseguito dalle funzioni chiamate da esso. Valori elevati CPU autonoma possono indicare un collo di bottiglia delle prestazioni all'interno della funzione stessa.
Modules Il nome del modulo contenente la funzione o il numero di moduli contenenti le funzioni in un nodo [Codice esterno].
Per visualizzare le chiamate di funzione che usano la percentuale più alta della CPU nella visualizzazione ad albero delle chiamate, fare clic su Espandi Hot Path. Il percorso principale può aiutare a concentrare l'indagine sull'area che avrebbe l'impatto maggiore.
Nota
Se visualizzi del codice nell'albero delle chiamate contrassegnato come codice "incompleto" o "stack non percorribile", ciò indica che probabilmente gli eventi di Event Tracing for Windows (ETW) sono stati eliminati. Provare a raccogliere la stessa traccia una seconda volta per risolvere il problema.
Per visualizzare una visualizzazione diversa dei dati, selezionare Flame Graph dall'elenco a discesa nella parte superiore del riquadro.
Il grafico di fiamma fornisce una visualizzazione diversa dell'albero delle chiamate che può aiutare a analizzare i dati. Per altre informazioni, vedere Identificare i percorsi caldi con un grafico di fiamma.
Per visualizzare le visualizzazioni dei dati aggregati per funzione o per modulo, selezionare Funzioni o moduli dall'elenco a discesa nella parte superiore del riquadro.
Queste viste aiutano a identificare funzioni o moduli che potrebbero rappresentare colli di bottiglia per le prestazioni a causa di un'elevata combinazione di frequenze di chiamata e problemi di prestazioni.
Visualizzare il codice esterno
Il codice esterno è costituito da funzioni nei componenti di sistema e framework che vengono eseguite dal codice che scrivi. Il codice esterno include funzioni che avviano e arresteranno 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 e quindi lo strumento 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, deselezionare Mostra Just My Code dall'elenco Impostazioni e quindi scegliere Applica.
Il codice esterno è costituito da funzioni nei componenti di sistema e framework che vengono eseguite dal codice che scrivi. Il codice esterno include funzioni che avviano e arresteranno 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 e quindi lo strumento Utilizzo CPU raccoglie le funzioni esterne di un metodo utente in un unico nodo [Codice esterno].
Se vuoi visualizzare i percorsi di chiamata del codice esterno, scegli Mostra codice esterno dalla lista Filtro visualizzazione e quindi scegli Applica.
Tenere presente che molte catene di chiamate di codice esterno sono profondamente annidate, quindi la larghezza della colonna Nome funzione può superare quella di visualizzazione della maggior parte dei monitor, eccetto i più grandi. In questo caso, i nomi delle funzioni vengono visualizzati come [...].
Usare la casella di ricerca per trovare un nodo che si sta cercando, quindi usare la barra di scorrimento orizzontale per visualizzare i dati.
Suggerimento
Se si profila codice esterno che chiama le funzioni di Windows, è necessario assicurarsi di avere il più recente .file pdb. Senza questi file, le visualizzazioni del report elencano i nomi delle funzioni di Windows che sono criptici e difficili da comprendere. Per ulteriori informazioni su come verificare di disporre dei file necessari, vedere Specificare i file di simboli (.pdb) e di origine nel debugger.
Passaggi successivi
In questa esercitazione si è appreso come raccogliere e analizzare i dati di utilizzo della CPU. Se hai già completato il tour del profiler, potresti voler seguire un tutorial che mostra come usare gli strumenti in modo più efficace.
In questa esercitazione si è appreso come raccogliere e analizzare i dati di utilizzo della CPU durante il debug. Per saperne di più sulla profilatura delle build di versione, puoi utilizzare il Profiler delle prestazioni.