2013-04-13 2 views
2

Есть ли какой-либо способ программно получить общее время выполнения программы C, а также количество времени, затраченного на определенную функцию? Мне нужно сделать это в коде, так как я хочу использовать эти два значения в качестве аргументов для другой функции. Поскольку я нахожусь в Linux, смогу ли я использовать gprof или perf для этого?Программно Получение общего времени и времени работы в Linux

+2

Вы провели какое-либо исследование? В частности, есть функции 'times' и' clock'. –

+0

Также см. Http://www.pixelbeat.org/programming/profiling/ –

ответ

2
  1. Возьмите системное время при запуске программы. Затем, когда вы хотите, вы можете получить текущее время и вычесть время начала. Это говорит о том, как долго вы работаете в режиме настенных часов.

  2. Имейте глобальное логическое значение Q, которое задано True, когда введена ваша функция, и False, когда он выходит, поэтому он является только True, когда программа включена в функцию (включительно).

  3. Настройка прерывания таймера для отключения каждого N мс и двух глобальных счетчиков: A и B. (N не должно быть маленьким.) Когда таймер прерывает, пусть он увеличивает B независимо, но только увеличивает A, если Q истинно.

Таким образом, вы знаете, сколько времени прошло, а A/B - это часть того времени, когда ваша функция находилась в стеке.

BTW: Если функция рекурсивна, пусть Q - целочисленный «счетчик глубины». В противном случае никаких изменений.

+0

В качестве альтернативы, не могу ли я просто запускать новый таймер внутри функции каждый раз, когда она вызывается, а когда функция возвращается, добавьте это прошедшее время в счетчик (например, B в вашем примере)? –

+2

@John: Это сработает, но вызов обычной процедуры может быть дорогим по сравнению с тем, что происходит в вашей функции. Преимущество метода прерывания заключается в том, что частота дискретизации может быть настолько низкой, насколько вы хотите. Он не должен быть высокой частотой. –

1

Да, вы можете использовать gprof, но для этого требуется перекомпилировать двоичный файл, который вы хотите измерить, чтобы вставить необходимый код мониторинга. По умолчанию программы не тратят время на запись этих данных, поэтому вы должны добавить их. С gcc это делается с использованием опции -pg.

+0

Как вы получите программные данные профилирования из gprof? Я не вижу пути. –

+0

-pg вводит код для подсчета вызовов функций и отслеживания вызывающего абонента; он не вставляет контрольный код; мониторинг осуществляется ОС, которая периодически отображает IP-адрес. –

1

Вы можете использовать gprof для этого же.

+0

Другой «ответ» тем, кто не прочитал вопрос. –

Смежные вопросы