Sök…


Profilering med gcc och gprof

Med GNU gprof-profiler, gprof , kan du profilera din kod. För att använda den måste du utföra följande steg:

  1. Bygg applikationen med inställningar för att generera profilinformation

  2. Generera profilinformation genom att köra den inbyggda applikationen

  3. Visa den genererade profileringsinformationen med gprof

För att bygga applikationen med inställningar för att generera profilinformation lägger vi till -pg flaggan. Så vi kan till exempel använda

$ gcc -pg *.cpp -o app

eller

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

och så vidare.

När applikationen, säg app , har byggts, kör den som vanligt:

$ ./app

Detta bör producera en fil som heter gmon.out .

Kör nu för att se profileringsresultaten

$ gprof app gmon.out

(Observera att vi tillhandahåller såväl applikationen som den genererade utdata).

Naturligtvis kan du också pipa eller omdirigera:

$ gprof app gmon.out | less

och så vidare.

Resultatet av det sista kommandot bör vara en tabell, vars rader är funktionerna, och vars kolumner anger antalet samtal, total tid, egen tid (det vill säga tid tillbringad i funktionen exklusive samtal till barn).

Generera kallgrafdiagram med gperf2dot

För mer komplexa applikationer kan platta exekveringsprofiler vara svåra att följa. Detta är anledningen till att många profileringsverktyg genererar också någon form av annoterad callgraph-information.

gperf2dot konverterar textutdata från många profilers (Linux perf, callgrind, oprofile etc.) till ett callgrafer diagram. Du kan använda den genom att köra din profiler (exempel 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

ange bildbeskrivning här

Profilering av CPU-användning med gcc och Google Perf Tools

Google Perf Tools tillhandahåller också en CPU-profiler, med ett lite vänligare gränssnitt. För att använda det:

  1. Installera Google Perf Tools
  2. Sätt din kod som vanligt
  3. Lägg till libprofiler profilerbiblioteket i ditt biblioteksbelastningsväg vid körning
  4. Använd pprof att generera en platt exekveringsprofil, eller ett kallgrafikdiagram

Till exempel:

# 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

var:

  • CPUPROFILE anger CPUPROFILE för profilering av data
  • CPUPROFILE_FREQUENCY indikerar CPUPROFILE_FREQUENCY ;

Använd pprof att efterbehandla profileringsdata.

Du kan skapa en platt samtalsprofil som text:

$ 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

... eller så kan du generera en kommenterad kallgrafik i en pdf med:

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


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow