Как измерить общее время выполнения функции в многопоточной среде Linux

Я хочу измерить общее время, потраченное на функцию C в Linux. Функция может быть вызвана одновременно из разных потоков, и затраченное время следует суммировать. Как я могу провести это измерение в Linux? Я рассмотрел функцию clock() и вычислил разницу между началом и концом функции.

Я нашел одно решение, использующее clock() в этом потоке в Stackoverflow: Как измерить общее время, проведенное в функции?

Но насколько я понимаю, это также будет включать обработку ЦП из потоков, выполняющих некоторые другие функции во время измерения. Это правильное предположение?

Есть ли другой способ сделать это измерение в Linux?


person Mansena    schedule 05.04.2017    source источник
comment
Есть ли другой способ сделать это измерение в Linux Да, clock_gettime с CLOCK_THREAD_CPUTIME_ID.   -  person n. 1.8e9-where's-my-share m.    schedule 05.04.2017
comment
Похоже на проблему XY. Что вы планируете делать со значениями ты получаешь? Измерение времени, затраченного на выполнение функции, обычно выполняется с определенной целью. Какая у тебя цель? Лучшим способом сделать это должен быть ваш вопрос.   -  person Andrew Henle    schedule 05.04.2017
comment
Цель следующая. У меня есть процесс, который обрабатывает трафик данных, а затем этот трафик доставляется клиенту через функцию обратного вызова, то есть он будет выполняться в том же процессе. Я хочу измерить, сколько ресурсов использует серверная часть. Один из способов, который я придумал, - это измерить время, затраченное на функцию обратного вызова, и вычесть его из общего времени выполнения процесса.   -  person Mansena    schedule 06.04.2017


Ответы (3)


В вашем вопросе указано, что вы используете Linux.

Вы можете использовать системный вызов getrusage (2) с параметром RUSAGE_THREAD , который предоставит вам накопленную статистику для текущего запущенного потока.

Сравнивая то, что находится в ru_utime и, возможно, ru_stime, до и после выполнения вашей функции, вы сможете определить, сколько времени функция накопила во времени процессора для текущего выполняющегося потока.

Вспенить, промыть, повторить для всех ниток и сложить.

person Sam Varshavchik    schedule 05.04.2017
comment
Это был бы хороший способ сделать это, но когда я попробовал, я заметил, что получил разрешение в миллисекундах, а не в микросекундах. Тогда время начала и время окончания имели одинаковое значение. - person Mansena; 06.04.2017
comment
Согласно elinux.org/, ядро ​​Linux отслеживает время процессора в миллисекундах. Ядро Linux просто не отслеживает время процессора на столь высоком уровне детализации. - person Sam Varshavchik; 06.04.2017

получение времени из функций семейства clock() и gettimeofday() хорошо для получения точной разницы во времени между двумя последовательными вызовами, но не годится для получения времени, затраченного на функции, из-за перепланирования потоков и процессов операционной системы и блокировки ввода-вывода нет никаких гарантий который ваш поток / процесс может получить ЦП до тех пор, пока не завершит свои операции, поэтому вы не можете передавать разницу во времени. У вас есть два выбора для этого

  1. Использование программ профилирования, таких как Intel V-Tune и Intel Inspector, которые будут использовать аппаратные счетчики производительности.

  2. Использование ядра Linux в реальном времени, планирование вашего процесса с помощью планировщика FIFO и использование разницы во времени, в планировщике FIFO никто не прерывает вашу программу, поэтому вы можете безопасно использовать разницу во времени как время, затраченное на функции, используя clock (), gettimeofday () или даже более точно rdtsc

person e.jahandar    schedule 05.04.2017

Очень хороший инструмент для анализа производительности perf (доступен в последних ядрах Linux):

Записывайте данные о производительности с помощью

perf record <command>

а затем проанализировать его с помощью

perf report

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

person Ctx    schedule 05.04.2017