Ricerca…
Creazione di profili con gcc e gprof
Il profilo GNU gprof, gprof , ti consente di profilare il tuo codice. Per usarlo, è necessario eseguire le seguenti operazioni:
Costruisci l'applicazione con le impostazioni per generare informazioni di profilazione
Genera informazioni di profilo eseguendo l'applicazione creata
Visualizza le informazioni di creazione generate con gprof
Per costruire l'applicazione con le impostazioni per generare informazioni di profilazione, aggiungiamo il flag -pg
. Quindi, per esempio, potremmo usare
$ gcc -pg *.cpp -o app
o
$ gcc -O2 -pg *.cpp -o app
e così via.
Una volta creata l'applicazione, ad esempio l' app
, eseguirla come al solito:
$ ./app
Questo dovrebbe produrre un file chiamato gmon.out
.
Per vedere i risultati del profilo, ora esegui
$ gprof app gmon.out
(nota che forniamo sia l'applicazione che l'output generato).
Ovviamente puoi anche pipe o reindirizzare:
$ gprof app gmon.out | less
e così via.
Il risultato dell'ultimo comando dovrebbe essere una tabella, le cui righe sono le funzioni e le cui colonne indicano il numero di chiamate, il tempo totale speso, il tempo trascorso in autonomia (ovvero il tempo trascorso nella funzione escludendo le chiamate ai bambini).
Generazione di diagrammi callgraph con gperf2dot
Per applicazioni più complesse, i profili di esecuzione flat possono essere difficili da seguire. Questo è il motivo per cui molti strumenti di profilazione generano anche una qualche forma di informazioni callgraph con annotazioni.
gperf2dot converte l'output di testo di molti profiler (Linux perf, callgrind, oprofile, ecc.) in un diagramma di callgraph. Puoi usarlo eseguendo il tuo profiler (esempio per gprof
):
# compile with profiling flags
g++ *.cpp -pg
# run to generate profiling data
./main
# translate profiling data to text, create image
gprof ./main | gprof2dot -s | dot -Tpng -o output.png
Profilazione dell'uso della CPU con gcc e Google Perf Tools
Google Perf Tools fornisce anche un profilo della CPU, con un'interfaccia leggermente più amichevole. Per usarlo:
- Installa Google Perf Tools
- Compila il tuo codice come al solito
- Aggiungi la libreria profiler
libprofiler
al percorso di caricamento della libreria in fase di runtime - Usa
pprof
per generare un profilo di esecuzione piatto o un diagramma del callgraph
Per esempio:
# compile code
g++ -O3 -std=c++11 main.cpp -o main
# run with profiler
LD_PRELOAD=/usr/local/lib/libprofiler.so CPUPROFILE=main.prof CPUPROFILE_FREQUENCY=100000 ./main
dove:
-
CPUPROFILE
indica il file di output per i dati di profilazione -
CPUPROFILE_FREQUENCY
indica la frequenza di campionamento del profiler;
Usa pprof
per post-elaborare i dati di profilazione.
È possibile generare un profilo di chiamata flat come testo:
$ pprof --text ./main main.prof
PROFILE: interrupts/evictions/bytes = 67/15/2016
pprof --text --lines ./main main.prof
Using local file ./main.
Using local file main.prof.
Total: 67 samples
22 32.8% 32.8% 67 100.0% longRunningFoo ??:0
20 29.9% 62.7% 20 29.9% __memmove_ssse3_back /build/eglibc-3GlaMS/eglibc-2.19/string/../sysdeps/x86_64/multiarch/memcpy-ssse3-back.S:1627
4 6.0% 68.7% 4 6.0% __memmove_ssse3_back /build/eglibc-3GlaMS/eglibc-2.19/string/../sysdeps/x86_64/multiarch/memcpy-ssse3-back.S:1619
3 4.5% 73.1% 3 4.5% __random_r /build/eglibc-3GlaMS/eglibc-2.19/stdlib/random_r.c:388
3 4.5% 77.6% 3 4.5% __random_r /build/eglibc-3GlaMS/eglibc-2.19/stdlib/random_r.c:401
2 3.0% 80.6% 2 3.0% __munmap /build/eglibc-3GlaMS/eglibc-2.19/misc/../sysdeps/unix/syscall-template.S:81
2 3.0% 83.6% 12 17.9% __random /build/eglibc-3GlaMS/eglibc-2.19/stdlib/random.c:298
2 3.0% 86.6% 2 3.0% __random_r /build/eglibc-3GlaMS/eglibc-2.19/stdlib/random_r.c:385
2 3.0% 89.6% 2 3.0% rand /build/eglibc-3GlaMS/eglibc-2.19/stdlib/rand.c:26
1 1.5% 91.0% 1 1.5% __memmove_ssse3_back /build/eglibc-3GlaMS/eglibc-2.19/string/../sysdeps/x86_64/multiarch/memcpy-ssse3-back.S:1617
1 1.5% 92.5% 1 1.5% __memmove_ssse3_back /build/eglibc-3GlaMS/eglibc-2.19/string/../sysdeps/x86_64/multiarch/memcpy-ssse3-back.S:1623
1 1.5% 94.0% 1 1.5% __random /build/eglibc-3GlaMS/eglibc-2.19/stdlib/random.c:293
1 1.5% 95.5% 1 1.5% __random /build/eglibc-3GlaMS/eglibc-2.19/stdlib/random.c:296
1 1.5% 97.0% 1 1.5% __random_r /build/eglibc-3GlaMS/eglibc-2.19/stdlib/random_r.c:371
1 1.5% 98.5% 1 1.5% __random_r /build/eglibc-3GlaMS/eglibc-2.19/stdlib/random_r.c:381
1 1.5% 100.0% 1 1.5% rand /build/eglibc-3GlaMS/eglibc-2.19/stdlib/rand.c:28
0 0.0% 100.0% 67 100.0% __libc_start_main /build/eglibc-3GlaMS/eglibc-2.19/csu/libc-start.c:287
0 0.0% 100.0% 67 100.0% _start ??:0
0 0.0% 100.0% 67 100.0% main ??:0
0 0.0% 100.0% 14 20.9% rand /build/eglibc-3GlaMS/eglibc-2.19/stdlib/rand.c:27
0 0.0% 100.0% 27 40.3% std::vector::_M_emplace_back_aux ??:0
... oppure puoi generare un callgraph annotato in un pdf con:
pprof --pdf ./main main.prof > out.pdf