Как использовать oprofile для расчета времени выполнения части программы на C?
Я хочу профилировать часть кода C (user_defined_function()) с помощью o profile и рассчитать время, необходимое для его выполнения. Любые указатели о том, как это сделать, были бы очень полезны. Заранее спасибо!!
#include <stdio.h>
int main()
{
//some statements;
//Begin Profiling
user_defined_function();
//End Profiling
//some statements;
return 0;
}
1 ответ
Я не вижу метки включения / выключения в документации http://oprofile.sourceforge.net/doc/index.html и http://oprofile.sourceforge.net/faq/. Возможно звонит (форк +exec) opcontrol
с --start
а также --stop
поможет, если код для профилирования достаточно длинный.
С perf
инструмент в режиме профилирования (выборки) perf record
(и / или, возможно, operf
который основан на том же perf_event_open
syscall) вы можете попробовать профилировать полную программу и добавить некоторые маркеры на Begin Profiling
а также End Profiling
точек (с помощью какого-либо пользовательского события трассировки), то вы можете сбросить весь perf.data
с perf script
найдите события ваших маркеров и обрежьте только часть профиля между маркерами (каждое событие в perf.data имеет метку времени, и они упорядочены или могут быть отсортированы по времени).
С непосредственным использованием perf_event_open
С помощью syscall вы можете включать и отключать профилирование из того же процесса с помощью вызовов ioctl, описанных на странице "man 2 perf_event_open" в дескрипторе fd perf с помощью PERF_EVENT_IOC_ENABLE
/ PERF_EVENT_IOC_DISABLE
действия. Страница Man также перечисляет использование prctl для временного отключения и включения профилирования в программе (это может даже работать с oprofile, отключить при запуске main
, включить в начале, отключить в конце)
Использование prctl(2) Процесс может включить или отключить все группы событий, которые к нему присоединены, с помощью операций prctl(2) PR_TASK_PERF_EVENTS_ENABLE и PR_TASK_PERF_EVENTS_DISABLE.
Другим способом использования счетчика производительности является не профилирование выборки, а подсчет (perf stat ./your_program
/ perf stat -d ./your_program
Является ли это). Этот режим не выдаст вам список "горячих" функций, он просто скажет, что ваш код выполнил 100 миллионов инструкций за 130 миллионов циклов, с 10 миллионами обращений к кэшу L1 и 5 миллионами кешей L1. Существуют оболочки для включения подсчета частей программы, например: PAPI http://icl.cs.utk.edu/papi/ ( PAPI_start_counters), perfmon2 (libpfm3, libpfm4), https://github.com/RRZE-HPC/likwid ( pdf, likwid_markerStartRegion), http://halobates.de/jevents.html & http://halobates.de/simple-pmu и т. Д.