C++
Profilierung
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:
Erstellen Sie die Anwendung mit Einstellungen zum Generieren von Profilierungsinformationen
Generieren Sie Informationen zur Profilerstellung, indem Sie die erstellte Anwendung ausführen
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
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:
- Installieren Sie die Google Perf Tools
- Kompilieren Sie Ihren Code wie gewohnt
- Fügen Sie die Bibliothek
libprofiler
zur Laufzeit Ihrem Bibliotheksladepfad hinzu - 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