Как использовать 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 и т. Д.

Другие вопросы по тегам