C++
profilering
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:
Bygg applikationen med inställningar för att generera profilinformation
Generera profilinformation genom att köra den inbyggda applikationen
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
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:
- Installera Google Perf Tools
- Sätt din kod som vanligt
- Lägg till
libprofiler
profilerbiblioteket i ditt biblioteksbelastningsväg vid körning - 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
angerCPUPROFILE
för profilering av data -
CPUPROFILE_FREQUENCY
indikerarCPUPROFILE_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