C++
профилирование
Поиск…
Профилирование gcc и gprof
Профайлер GNU gprof, gprof , позволяет вам профилировать свой код. Чтобы использовать его, вам необходимо выполнить следующие шаги:
Создайте приложение с настройками для генерации профилирующей информации
Генерирование профилирующей информации путем запуска встроенного приложения
Просмотр сгенерированной профилирующей информации с помощью 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 также предоставляет профилировщик процессора со слегка более дружественным интерфейсом. Чтобы использовать его:
- Установка Google Perf Tools
- Скомпилируйте свой код как обычно
- Добавить библиотеку профилировщика
libprofiler
в путь загрузки библиотеки во время выполнения - Используйте
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