2015-07-16 11 views
5

Sto usando perf per avere un'idea del sovraccarico che ogni funzione del mio programma impone sul tempo di esecuzione totale. Per questo, uso CPU-cicli evento:Come funziona il perf?

perf record -e cpu-cycles -c 10000 <binary-with-arguments> 

Quando guardo in uscita, vedo alcune percentuali associate a ciascuna funzione. Ma ciò che non ha senso per me è un caso come questo: la funzione A è chiamata all'interno della funzione B e da nessun'altra parte. Ma la percentuale di sovraccarico che ottengo per la funzione A è superiore a B. Se B chiama A, ciò significa che B dovrebbe includere il sovraccarico di A. O mi sto perdendo qualcosa qui?

risposta

5

Il comando perf utilizzato sta campionando i programmi senza registrare alcuna informazione dello stack di chiamate. Usando perf report ottieni il numero di campioni che rientrano nelle tue funzioni indipendentemente dalle loro relazioni di chiamata.

È possibile utilizzare l'opzione --call-graph per ottenere un albero quando si utilizza perf report:

perf record -e cpu-cycles --call-graph dwarf -c 10000 <binary-with-arguments> 
1

Perf lavora sul modello registri specifici di CPU per le misure, come cicli o filiali-miss o giù di lì. Una parte speciale chiamata PMU (Performance Measurement Unit) sta contando tutti i tipi di eventi.

Quindi, se si misurano solo alcune funzioni del programma, non c'è in realtà alcun sovraccarico, perché la PMU della CPU funziona indipendentemente dal calcolo effettivo.

Se si supera il numero di registro della PMU, la misurazione passa attraverso le funzioni da misurare. Perf annota questo con [XX%].