Suche…


Profilierung mit gcc und gprof

Mit dem GNU gprof-Profiler gprof können Sie Ihren Code profilieren. Um es zu verwenden, müssen Sie die folgenden Schritte ausführen:

  1. Erstellen Sie die Anwendung mit Einstellungen zum Generieren von Profilierungsinformationen

  2. Generieren Sie Informationen zur Profilerstellung, indem Sie die erstellte Anwendung ausführen

  3. Zeigen Sie die generierten Profilinformationen mit gprof an

Um die Anwendung mit Einstellungen zum Generieren von Profilierungsinformationen zu erstellen, fügen Sie das Flag -pg . So könnten wir zum Beispiel verwenden

$ gcc -pg *.cpp -o app

oder

$ gcc -O2 -pg *.cpp -o app

und so weiter.

Sobald die Anwendung, beispielsweise die app , erstellt wurde, führen Sie sie wie gewohnt aus:

$ ./app

Dies sollte eine Datei namens gmon.out .

Um die Ergebnisse der Profilerstellung zu sehen, führen Sie jetzt aus

$ gprof app gmon.out

(Beachten Sie, dass wir sowohl die Anwendung als auch die generierte Ausgabe bereitstellen).

Natürlich können Sie auch pfeifen oder umleiten:

$ gprof app gmon.out | less

und so weiter.

Das Ergebnis des letzten Befehls sollte eine Tabelle sein, deren Zeilen die Funktionen sind, und deren Spalten die Anzahl der Aufrufe, die Gesamtzeit und die selbst verbrachte Zeit (dh die Zeit in der Funktion, die Aufrufe von Kindern enthält) angeben.

Callgraph-Diagramme mit gperf2dot erstellen

Für komplexere Anwendungen kann es schwierig sein, flache Ausführungsprofile zu verfolgen. Aus diesem Grund generieren viele Tools zur Profilerstellung auch eine Art kommentierter Callgraph-Informationen.

gperf2dot konvertiert Textausgaben vieler Profiler (Linux perf, callgrind, oprofile usw.) in ein Callgraph-Diagramm. Sie können es verwenden, indem Sie Ihren Profiler gprof (Beispiel für 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

Geben Sie hier die Bildbeschreibung ein

Profilierung der CPU-Nutzung mit gcc und Google Perf Tools

Google Perf Tools bietet auch einen CPU-Profiler mit einer etwas freundlicheren Benutzeroberfläche. Um es zu benutzen:

  1. Installieren Sie die Google Perf Tools
  2. Kompilieren Sie Ihren Code wie gewohnt
  3. Fügen Sie die Bibliothek libprofiler zur Laufzeit Ihrem Bibliotheksladepfad hinzu
  4. Verwenden Sie pprof , um ein Profil für die flache Ausführung oder ein Callgraph-Diagramm zu erstellen

Zum Beispiel:

# 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

woher:

  • CPUPROFILE gibt die Ausgabedatei zum Profilieren von Daten an
  • CPUPROFILE_FREQUENCY gibt die Abtastfrequenz des Profilers an.

Verwenden Sie pprof , um die Profilierungsdaten pprof .

Sie können ein Flat-Call-Profil als Text generieren:

$ 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

... oder Sie können eine kommentierte Callgraph-Datei in einer PDF-Datei erzeugen mit:

pprof --pdf ./main main.prof > out.pdf


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow