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:

  1. Bouw de applicatie met instellingen voor het genereren van profielinformatie

  2. Genereer profileerinformatie door de ingebouwde applicatie uit te voeren

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

voer hier de afbeeldingsbeschrijving in

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:

  1. Installeer Google Perf Tools
  2. Compileer uw code zoals gewoonlijk
  3. Voeg de libprofiler profiler-bibliotheek toe aan uw bibliotheeklaadpad tijdens runtime
  4. 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


Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow