Domanda

Mentre stavo lavorando a un progetto universitario, ho usato un profiler interno al progetto realizzato da uno studente anziano, era molto semplice ma abbastanza buono dal momento che il suo compito era sottrarre i tempi tra due punti del codice e fornire statistiche.

Ora, come funziona un profiler professionista? Preelabora il codice per inserire checkpoint o cose del genere? Legge il codice binario con i dati di debug per rilevare dove viene chiamata una funzione?

Grazie.

È stato utile?

Soluzione

Esistono molti profili diversi che funzionano in modi diversi.

I profiler comunemente usati semplicemente esaminano regolarmente il programma in esecuzione per vedere quali istruzioni di assemblaggio sono attualmente in esecuzione (il contatore del programma) e quali routine hanno chiamato la funzione corrente (stack di chiamate). Questo tipo di profilatore campionamento può funzionare con file binari standard, ma sono più utili se si dispone di simboli di debug per elaborare righe di codice fornite di indirizzi nel programma.

Oltre a campionare regolarmente, puoi anche utilizzare i contatori delle prestazioni del processore per campionare dopo un certo numero di eventi come mancati cache, che ti aiuteranno a vedere quali parti del tuo programma stanno rallentando a causa degli accessi alla memoria.

Altri profilatori implicano la ricompilazione del programma per inserire istruzioni (note come strumentazione ) per contare la frequenza con cui vengono eseguiti tutti i set continui di istruzioni (blocchi di base), o forse anche registrare la sequenza in cui i blocchi di base vengono eseguiti o registrano il contenuto delle variabili in determinati punti.

L'approccio alla strumentazione può darti tutta la precisione e i dati che potresti desiderare, ma rallenterà il programma e questo cambierà le sue caratteristiche prestazionali. Al contrario, con approcci basati sul campionamento è possibile ottimizzare l'impatto delle prestazioni in base al periodo di tempo necessario per eseguire il programma in base alla precisione dei dati del profilo ottenuti.

Altri suggerimenti

Esistono due strategie di profilazione comuni (comunque per le lingue basate su VM): strumentazione e campionamento.

La strumentazione inserisce checkpoint e informa il profiler ogni volta che un metodo inizia e finisce. Questo può essere fatto dal JIT / interprete o da una fase di compilazione post-normale ma pre-esecuzione che modifica l'eseguibile. Ciò può avere un effetto molto significativo sulle prestazioni (inclinando così qualsiasi risultato di temporizzazione). È buono per ottenere conteggi accurati però.

Il campionamento chiede periodicamente alla VM come appare la traccia dello stack per tutti i thread e aggiorna le sue statistiche in quel modo. In genere ciò influisce meno sulle prestazioni, ma produce conteggi delle chiamate meno accurati.

Dipende dal tipo di codice da analizzare, ad esempio .NET CLR fornisce strumento per i profiler di codice. Quando si tratta di codice gestito è possibile riscrivere il codice intermedio per iniettare hook personalizzati. Inoltre è possibile analizzare la traccia dello stack delle applicazioni. Il sistema operativo può fornire mezzi per la profilazione, ad esempio Windows ha performance contatori . Quando si ha a che fare con il codice incorporato, è possibile emulare / sostituire l'hardware sottostante per monitorare efficacemente le prestazioni del sistema.

Come ha scritto Jon Skeet sopra ci sono due strategie: strumentazione e campionamento.

La strumentazione viene eseguita sia manualmente che automaticamente. In caso manuale: lo sviluppatore inserisce manualmente il codice per tenere traccia dell'inizio / fine di una regione di codice di interesse. Ad esempio un semplice " StartTimer " e "EndTimer". Alcuni strumenti del profiler possono farlo automaticamente anche per questo - per questo il profiler dovrà fare un'analisi statica del codice, cioè analizzare il codice e identificare punti di controllo importanti come l'inizio / fine di uno o più metodi particolari. Questo è molto semplice con le lingue che supportano la riflessione (ad esempio qualsiasi linguaggio .net). Usando 'reflection' il profiler è in grado di ricostruire l'intero albero del codice sorgente (insieme ai grafici delle chiamate).

Il campionamento viene eseguito dal profiler e cerca nel codice binario. Il profiler può anche utilizzare tecniche come Hooks o intercettare eventi / messaggi di Windows ai fini della profilazione.

Sia la strumentazione che i metodi di campionamento hanno le proprie spese generali. La quantità di spese generali dipende, ad es. se la frequenza di campionamento è impostata su valori elevati, la profilazione stessa può contribuire in modo significativo alle prestazioni riportate.

Strumentazione contro campionamento: Non è che uno sia migliore dell'altro approccio. Entrambi hanno il loro posto.

L'approccio migliore è iniziare con un profiler basato sul campionamento e osservare l'intero livello del sistema. Cioè esegui il campionatore e vedi l'utilizzo delle risorse a livello di sistema: memoria, disco rigido, rete, CPU.

Da quanto sopra identifica le risorse che vengono soffocate.

Con le informazioni di cui sopra, ora puoi aggiungere la strumentazione al tuo codice per individuare il colpevole. Ad esempio, se la memoria è la risorsa più utilizzata, aiuterà a strumentare il codice relativo all'allocazione della memoria. Nota che con la strumentazione ti stai davvero concentrando su una particolare area del tuo codice.

per gprof in * nix, al momento della compilazione e del collegamento usando -pg, un codice aggiuntivo viene iniettato nel codice oggetto. Quindi eseguendo gprof, un file di report viene generato dal codice iniettato.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top