Zoeken…
Profilering met gcc en gprof
Met de GNU gprof profiler, gprof , kunt u uw code profileren. Om het te gebruiken, moet u de volgende stappen uitvoeren:
Bouw de applicatie met instellingen voor het genereren van profielinformatie
Genereer profileerinformatie door de ingebouwde applicatie uit te voeren
Bekijk de gegenereerde profielinformatie met gprof
Om de applicatie te bouwen met instellingen voor het genereren van -pg
, voegen we de vlag -pg
. Dus we zouden bijvoorbeeld kunnen gebruiken
$ gcc -pg *.cpp -o app
of
$ gcc -O2 -pg *.cpp -o app
enzovoorts.
Zodra de applicatie, zeg app
, is gebouwd, voert u deze uit zoals gewoonlijk:
$ ./app
Dit zou een bestand met de naam gmon.out
moeten produceren.
Om de profileringsresultaten te bekijken, voer je nu uit
$ gprof app gmon.out
(houd er rekening mee dat we zowel de toepassing als de gegenereerde uitvoer leveren).
Je kunt natuurlijk ook pijpen of doorverwijzen:
$ gprof app gmon.out | less
enzovoorts.
Het resultaat van het laatste commando moet een tabel zijn, waarvan de rijen de functies zijn, en waarvan de kolommen het aantal oproepen, totale bestede tijd, zelf doorgebrachte tijd aangeven (dat wil zeggen, tijd doorgebracht in de functie exclusief oproepen naar kinderen).
Callgraph-diagrammen genereren met gperf2dot
Voor complexere toepassingen kunnen platte uitvoeringsprofielen moeilijk te volgen zijn. Dit is de reden waarom veel profileringshulpmiddelen ook een vorm van geannoteerde callgraph-informatie genereren.
gperf2dot converteert tekstuitvoer van vele profilers (Linux perf, callgrind, oprofile etc.) in een callgraph-diagram. U kunt het gebruiken door uw profiler uit te voeren (bijvoorbeeld voor 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
Profilering CPU-gebruik met gcc en Google Perf Tools
Google Perf Tools biedt ook een CPU-profiler, met een iets vriendelijkere interface. Om het te gebruiken:
- Installeer Google Perf Tools
- Compileer uw code zoals gewoonlijk
- Voeg de
libprofiler
profiler-bibliotheek toe aan uw bibliotheeklaadpad tijdens runtime - Gebruik
pprof
om een vlak uitvoeringsprofiel of een callgraph-diagram te genereren
Bijvoorbeeld:
# 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
waar:
-
CPUPROFILE
geeft het uitvoerbestand aan voor profilering van gegevens -
CPUPROFILE_FREQUENCY
geeft de bemonsteringsfrequentie van de profiler aan;
Gebruik pprof
om de profileringsgegevens achteraf te verwerken.
U kunt een plat oproepprofiel genereren als tekst:
$ 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
... of u kunt een geannoteerde callgraph in een pdf genereren met:
pprof --pdf ./main main.prof > out.pdf