Szukaj…
Profilowanie za pomocą gcc i gprof
Program profilujący gprof GNU, gprof , umożliwia profilowanie twojego kodu. Aby z niego skorzystać, wykonaj następujące czynności:
Zbuduj aplikację z ustawieniami do generowania informacji profilowania
Generuj informacje profilowania, uruchamiając wbudowaną aplikację
Wyświetl wygenerowane informacje profilowania za pomocą gprof
Aby zbudować aplikację z ustawieniami do generowania informacji profilujących, dodajemy flagę -pg
. Na przykład moglibyśmy użyć
$ gcc -pg *.cpp -o app
lub
$ gcc -O2 -pg *.cpp -o app
i tak dalej.
Gdy aplikacja, powiedzmy app
, zostanie zbudowana, uruchom ją jak zwykle:
$ ./app
To powinno wygenerować plik o nazwie gmon.out
.
Aby zobaczyć wyniki profilowania, uruchom teraz
$ gprof app gmon.out
(zauważ, że zapewniamy zarówno aplikację, jak i wygenerowane dane wyjściowe).
Oczywiście możesz także potokować lub przekierowywać:
$ gprof app gmon.out | less
i tak dalej.
Wynikiem ostatniego polecenia powinna być tabela, której wiersze są funkcjami, a kolumny wskazują liczbę wywołań, całkowity czas spędzony, czas własny spędzony (tj. Czas spędzony w funkcji z wyłączeniem wywołań do dzieci).
Generowanie diagramów kaligrafów za pomocą gperf2dot
W przypadku bardziej złożonych aplikacji płaskie profile wykonania mogą być trudne do naśladowania. Właśnie dlatego wiele narzędzi profilujących generuje również jakąś formę adnotacji z informacjami o grafie wywołań.
gperf2dot konwertuje tekst z wielu profilerów (Linux perf, callgrind, oprofile itp.) na diagram callgraph. Możesz go użyć, uruchamiając swój profiler (przykład dla 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
Profilowanie użycia procesora za pomocą gcc i Google Perf Tools
Google Perf Tools zapewnia również profiler procesora z nieco bardziej przyjaznym interfejsem. Aby go użyć:
- Zainstaluj Google Perf Tools
- Skompiluj swój kod jak zwykle
- Dodaj bibliotekę profilującą
libprofiler
do ścieżki ładowania biblioteki w czasie wykonywania - Użyj
pprof
aby wygenerować płaski profil wykonania lub diagram kaligraficzny
Na przykład:
# 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
gdzie:
-
CPUPROFILE
wskazuje plik wyjściowy do profilowania danych -
CPUPROFILE_FREQUENCY
wskazuje częstotliwość próbkowania profilera;
Użyj pprof
aby przetworzyć dane profilowania.
Możesz wygenerować płaski profil połączenia jako 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
... lub możesz wygenerować adnotację callgraph w pliku pdf za pomocą:
pprof --pdf ./main main.prof > out.pdf