Поиск…


Профилирование gcc и gprof

Профайлер GNU gprof, gprof , позволяет вам профилировать свой код. Чтобы использовать его, вам необходимо выполнить следующие шаги:

  1. Создайте приложение с настройками для генерации профилирующей информации

  2. Генерирование профилирующей информации путем запуска встроенного приложения

  3. Просмотр сгенерированной профилирующей информации с помощью gprof

Чтобы создать приложение с настройками для генерации профилирующей информации, мы добавляем флаг -pg . Так, например, мы могли бы использовать

$ gcc -pg *.cpp -o app

или же

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

и так далее.

Как только приложение, скажем, app , будет создано, выполните его как обычно:

$ ./app

Это должно создать файл gmon.out .

Чтобы просмотреть результаты профилирования, выполните

$ gprof app gmon.out

(обратите внимание, что мы предоставляем как приложение, так и сгенерированный вывод).

Конечно, вы можете также перенаправить или перенаправить:

$ gprof app gmon.out | less

и так далее.

Результатом последней команды должна быть таблица, строками которой являются функции, а в столбцах которой указано количество вызовов, общее время, затраченное на самостоятельное время (т. Е. Время, затрачиваемое на функцию, исключая вызовы для детей).

Генерирование диаграмм callgraph с помощью gperf2dot

Для более сложных приложений трудно выполнить плоские профили выполнения. Вот почему многие инструменты профилирования также генерируют некоторую форму аннотированной информации об обслуживании.

gperf2dot преобразует текстовый вывод из многих профилировщиков (Linux perf, callgrind, oprofile и т. д.) в диаграмму callgraph. Вы можете использовать его, запустив свой профилировщик (пример для 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

введите описание изображения здесь

Профилирование использования процессора с помощью gcc и Google Perf Tools

Google Perf Tools также предоставляет профилировщик процессора со слегка более дружественным интерфейсом. Чтобы использовать его:

  1. Установка Google Perf Tools
  2. Скомпилируйте свой код как обычно
  3. Добавить библиотеку профилировщика libprofiler в путь загрузки библиотеки во время выполнения
  4. Используйте pprof для создания плоского профиля выполнения или диаграммы вызова

Например:

# 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

где:

  • CPUPROFILE указывает выходной файл для профилирования данных
  • CPUPROFILE_FREQUENCY указывает частоту выборки профайлера;

Используйте pprof для pprof обработки данных профилирования.

Вы можете создать профиль плоских вызовов в виде текста:

$ 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

... или вы можете создать аннотированный callgraph в pdf с:

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


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow