Вычисление времени выполнения C-функций

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

Мой вопрос в том, что было бы лучшим и наиболее эффективным способом кодирования этого?

поскольку это процедурный код, написанный на C, мне придется добавить код ко всем (около 20) функциям для запуска таймера, окончания таймера и вычислить разницу. Есть ли лучший способ, чем этот?


person punekr12    schedule 22.07.2013    source источник
comment
Почему бы вам не написать функцию или макрос, содержащий ваш временной код, и не обернуть им вызовы функций?   -  person Carl Norum    schedule 23.07.2013
comment
Добавить уровень программы или уровень процедуры? Если это программа, вы можете использовать время. Если на уровне процедуры, время вызова, сохранение значения, вызов снова после истечения тактов процедуры и записи.   -  person Jiminion    schedule 23.07.2013
comment
@CarlNorum даже тогда мне приходится добавлять два вызова функций к каждой функции. Но тогда это то, что я мог бы в конечном итоге сделать   -  person punekr12    schedule 23.07.2013
comment
Я не уверен, что понимаю; не могли бы вы поместить это в макрос?   -  person Carl Norum    schedule 23.07.2013
comment
Может быть, просто добавить один вызов после каждой функции, которая вычисляет предыдущее время и настраивается на следующий раз. Вам нужно будет инициировать его и завершить его двумя другими вызовами.   -  person Jiminion    schedule 23.07.2013


Ответы (2)


Для этой цели вы можете использовать внешний инструмент профилировщика. gprof — хорошо известный стандартный инструмент. Вот простой пример использования:

$ gcc -pg a.c -o a
$ ./a
$ gprof

Этот инструмент отображает общее время работы (абсолютное и процентное) каждой функции.

Однако это почти бесполезно, если вам нужна эта информация во время выполнения.

person Ivan Smirnov    schedule 22.07.2013
comment
Спасибо за информацию ! но я хочу иметь возможность включать/выключать его во время выполнения с помощью переменной env - person punekr12; 23.07.2013

#include<time.h>
.
.
.
clock_t start, end, total;
start = clock();
.
.
.
end = clock();
total = (double) (start - end) / CLOCKS_PER_SEC;

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

person ctrl-shift-esc    schedule 23.07.2013