Misurare le prestazioni dell'applicazione analizzando l'utilizzo della CPU (C#, Visual Basic, C++, F#)
Individua i problemi di prestazioni mentre esegui il debug con lo strumento diagnostico di utilizzo CPU integrato nel debugger. È 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 viene sospeso, lo strumento Utilizzo CPU nella finestra Strumenti di Diagnostica raccoglie informazioni sulle funzioni che vengono eseguite nell'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++. È necessario il carico di lavoro corrispondente di 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 Opzioni>>IntelliTrace.
Si esaminerà principalmente l'utilizzo della CPU, quindi assicurarsi che utilizzo CPU sia abilitato (è abilitato per impostazione predefinita).
Fare clic su Debug>Avvia debug (oppure Avvia sulla barra degli strumenti, oppure F5).
Al termine del caricamento dell'app, si apre la vista 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à attivare il primo punto di interruzione.
Mentre il debugger è in pausa, abilitare la raccolta dei dati sull'Utilizzo della CPU e quindi aprire la scheda Utilizzo 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 fino 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 riscontri problemi durante la raccolta o la visualizzazione dei dati, consulta Risoluzione degli errori di profiling e soluzione dei problemi.
Consiglio
Quando si tenta di identificare i problemi di prestazioni, eseguire più misurazioni. Le prestazioni variano naturalmente da esecuzione a esecuzione e i percorsi di codice vengono in genere eseguiti più lentamente alla prima esecuzione a causa dei lavori di inizializzazione da eseguire una sola volta, come il caricamento di DLL, la compilazione JIT dei metodi e l'inizializzazione delle cache. Prendendo più misurazioni, si ottiene una migliore comprensione dell'intervallo e della mediana della metrica visualizzata, che consente di confrontare la prima volta rispetto alle prestazioni in uno 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.
Mancia
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 visualizzazione chiamante/chiamato dal menu a discesa.
In questa visualizzazione, la funzione selezionata viene visualizzata nell'intestazione e nella casella Funzione Corrente (DoWork, in questo esempio). La funzione che ha chiamato la funzione corrente è visualizzata a sinistra sotto Funzioni Chiamanti, e tutte le funzioni chiamate dalla funzione corrente sono 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) impiegato nel corpo della funzione escludendo il tempo impiegato per chiamare e chiamare funzioni.
Quando si fa doppio clic su una funzione, la visualizzazione chiamante/chiamato si apre nel riquadro sinistro.
In questa visualizzazione, la funzione selezionata compare 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) impiegato nel corpo della funzione escludendo il tempo impiegato per chiamare e chiamare funzioni. 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 nel Corpo della Funzione 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 principale nell'albero delle chiamate di utilizzo della 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 la funzione Mostra Codice Esterno è disabilitata, i metodi dell'applicazione possono contenere anche un nodo, [Codice Esterno]. Di seguito sono riportate altre informazioni sui valori delle colonne:
La CPU totale indica quanta attività è stata svolta dalla funzione e da qualsiasi funzione chiamata da essa. I valori totali elevati della CPU puntano alle funzioni che sono più costose nel complesso.
Self CPU indica quanto lavoro è stato eseguito dal codice nel corpo della funzione, escluso il lavoro eseguito dalle funzioni chiamate da essa. Valori elevati CPU autonoma possono indicare un collo di bottiglia delle performance 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 il percorso di maggiore utilizzo. Il percorso principale può aiutare a concentrare l'indagine sull'area che ha l'impatto maggiore.
Nota
Se viene visualizzato il codice nell'albero delle chiamate contrassegnato come codice "interrotto" o "stack non eseguibile", indica che gli eventi ETW (Event Tracing for Windows) sono stati probabilmente 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 diagramma a fiamma.
Visualizzare il codice esterno
I codici esterni sono funzioni nei componenti di sistema e framework che vengono eseguite dal codice che si scrive. Il codice esterno include funzioni che avviano e arrestano l'app, disegnano l'interfaccia utente, controllano i thread 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 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 del sistema e del framework che sono eseguite dal codice che scrivi. Il codice esterno include funzioni che 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 e quindi lo strumento Utilizzo CPU raccoglie le funzioni esterne di un metodo utente in un unico nodo [Codice esterno].
Se desideri visualizzare i percorsi di chiamata del codice esterno, scegli Mostra codice esterno dall'elenco visualizzazione filtro e quindi scegli Applica.
Tenere presente che molte catene di chiamate di codice esterno sono profondamente annidate, al punto che la larghezza della colonna Nome funzione può superare la larghezza di visualizzazione di tutti tranne i monitor 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.
Consiglio
Se si profila codice esterno che chiama le funzioni di Windows, è necessario assicurarsi di avere i file.pdb più recenti. 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 accertarsi di avere i file necessari, vedere specificare i file dei simboli (.pdb) e i file 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, ti potrebbe interessare un tutorial che illustra 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ù su come profilare le build di versione usando il Performance Profiler.