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:

  1. Costruisci l'applicazione con le impostazioni per generare informazioni di profilazione

  2. Genera informazioni di profilo eseguendo l'applicazione creata

  3. 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

inserisci la descrizione dell'immagine qui

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:

  1. Installa Google Perf Tools
  2. Compila il tuo codice come al solito
  3. Aggiungi la libreria profiler libprofiler al percorso di caricamento della libreria in fase di runtime
  4. 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


Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow