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:

  1. Zbuduj aplikację z ustawieniami do generowania informacji profilowania

  2. Generuj informacje profilowania, uruchamiając wbudowaną aplikację

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

wprowadź opis zdjęcia tutaj

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ć:

  1. Zainstaluj Google Perf Tools
  2. Skompiluj swój kod jak zwykle
  3. Dodaj bibliotekę profilującą libprofiler do ścieżki ładowania biblioteki w czasie wykonywania
  4. 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


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow