2012-12-03 19 views
14

Sto provando a profilare (con Callgrind) una parte specifica del mio codice rimuovendo rumore e computazione che non mi interessa. Ecco un esempio di quello che voglio fare:Callgrind: profilo di una parte specifica del mio codice

for (int i=0; i<maxSample; ++i) { 
    //Prepare data to be processed... 
    //Method to be profiled with these data 
    //Post operation on the data 
} 

mio caso d'uso è un test di regressione, voglio fare in modo che il metodo in questione è ancora abbastanza veloce (si parla di meno del 10% in più istruzioni dall'ultima implementazione). Ecco perché mi piacerebbe avere l'output più pulito di Callgrind. (Ho bisogno di un ciclo for in modo da avere una quantità significativa di dati trattati in modo da avere una buona stima del comportamento del metodo che voglio al profilo)

Il mio primo tentativo è stato quello di modificare il codice a:

for (int i=0; i<maxSample; ++i) { 
    //Prepare data to be processed... 
    CALLGRIND_START_INSTRUMENTATION; 
    //Method to be profiled with these data 
    CALLGRIND_STOP_INSTRUMENTATION; 
    //Post operation on the data 
} 
CALLGRIND_DUMP_STATS; 

Aggiunta delle macro Callgrind per controllare la strumentazione. Ho anche aggiunto il --instr-atstart = no opzioni per essere sicuro di profilare solo la parte del codice che voglio ...

Sfortunatamente con questa configurazione quando inizio a lanciare il mio eseguibile con callgrind, non finisce mai ... Non è una questione di lentezza, perché una strumentazione completa dura meno di un minuto.

Ho anche provato

for (int i=0; i<maxSample; ++i) { 
    //Prepare data to be processed... 
    CALLGRIND_TOGGLE_COLLECT; 
    //Method to be profiled with these data 
    CALLGRIND_TOGGLE_COLLECT; 
    //Post operation on the data 
} 
CALLGRIND_DUMP_STATS; 

(o = opzione "myMethod" --toggle-collect) Ma Callgrind mi ha restituito un log senza alcuna chiamata (KCachegrind è bianco come la neve :(e dice a zero istruzioni ...)

ho usato le macro/opzioni correttamente? Qualsiasi idea di che cosa ho bisogno di cambiare al fine di ottenere il risultato atteso?

risposta

12

sono finalmente riuscito a risolvere questo problema ... questa è stata una problema di configurazione:

ho mantenuto il codice

for (int i=0; i<maxSample; ++i) { 
    //Prepare data to be processed... 
    CALLGRIND_TOGGLE_COLLECT; 
    //Method to be profiled with these data 
    CALLGRIND_TOGGLE_COLLECT; 
    //Post operation on the data 
} 
CALLGRIND_DUMP_STATS; 

Ma correva l'callgrind con --collect-atstart = no (e senza la --instr-atstart = no !!!) e ha funzionato perfettamente, in un tempo ragionevole (~ 1min).

Il problema con la strumentazione START/STOP era che callgrind scarica un file (callgrind.out. # Numero) ad ogni iterazione (ogni STOP) quindi era veramente molto lento ... (dopo 5 minuti avevo solo 5000 corse per un benchmark di 300.000 iterazioni ... inadatto per un test di regressione).

+0

in modo da non avviare/interrompere la strumentazione? – Paschalis

+1

@Paschalis start/stop creerà nuovo dump ogni volta che si chiama stop. Se si desidera ottenere l'aggregazione in un singolo report, l'interruttore sembra essere la strada da percorrere (in pratica si tratta semplicemente di attivare la strumentazione attiva/inattiva). – joetde

+0

grazie per la risposta @joetde. Ho chiesto perché sto affrontando un problema in cui le callback/macro di callgrind o qualsiasi altro strumento non sembrano essere mai chiamate. Altro [qui] (http://goo.gl/08OM3c)! – Paschalis

0

L'opzione a levetta-raccolta è molto difficile in quanto si specifica il metodo da utilizzare come trigger. In realtà devi anche specificare il suo elenco di argomenti, e anche lo spazio bianco deve corrispondere! Usa il nome del metodo esattamente come appare nell'output del callgrind. Per esempio, io sto usando questa invocazione:

$ valgrind 
    --tool=callgrind 
    --collect-atstart=no 
    "--toggle-collect=ctrl_simulate(float, int)" 
    ./swaag 

Si prega di osservare:

  • Le doppie virgolette intorno l'opzione.
  • L'elenco degli argomenti include le parentesi.
  • Lo spazio vuoto dopo il carattere virgola.