2012-10-23 15 views
5

Sto profilando il mio codice e ho già trovato la parte più costosa di esso. Tuttavia accade in una funzione inline. Per misurare l'impatto, ho forzato la funzione a non essere in linea.Funzioni inline Callgrind

Ora desidero segnalare dati di profiling accurati. Senza l'inline abbiamo un sovraccarico enorme (la funzione è fondamentalmente un singolo ciclo, ma è chiamata molto, molto spesso).

Mi chiedo se è possibile istruire valgrind a trattare una sezione specifica del codice come se fosse una funzione da sola (come il makros CALLGRIND_START_INSTRUMENTATION, CALLGRIND_STOP_INSTRUMENTATION) senza forzare la funzione a non essere in linea.

risposta

5
valgrind --tool=callgrind 

è in grado di mostrare un sacco di dettagli su dove è speso la CPU (ed altri costi come come cache). kcachegrind (strumento di visualizzazione) può facilmente mostrare i vari costi (incluso per le funzioni inline).

Prova ad eseguire per es. con:

valgrind --tool=callgrind --dump-instr=yes --collect-jumps=yes 

Nota: a guardare i costi a livello di istruzione, è necessario utilizzare kcachegrind

+0

In effetti funziona alla grande. kcachegrind è uno strumento molto carino! – ypnos

-1

Im non sicuro se questo è ciò che si vuole, ma non sono sicuro non lo è :):
http://valgrind.org/docs/manual/cg-manual.html#cg-manual.overview

Inoltre, dal momento che uno di istruzioni cache di lettura viene eseguita per istruzione eseguita, è possibile trovare il numero di istruzioni eseguite per linea , che può essere utile per la profilazione tradizionale.

+0

Sì, ho letto che la linea, tuttavia, non sono riuscito a trovare il modo di fare qualcosa al di là di funzione-scope granularità. – ypnos

0

Forse si potrebbe chiamare la macro CALLGRIND_TOGGLE_COLLECT appena prima di chiamare la funzione e all'inizio della funzione, idem per l'uscita della funzione e subito dopo la chiamata della funzione. E.g.

int main() 
{ 
    CALLGRIND_TOGGLE_COLLECT; 
    myFunction(); 
    CALLGRIND_TOGGLE_COLLECT; 
} 

__attribute__((noinline)) 
void myFunction() 
{ 
    CALLGRIND_TOGGLE_COLLECT; 
    //Do stuff 
    CALLGRIND_TOGGLE_COLLECT; 
} 

Dovrebbe fare il trucco.

Problemi correlati