Почему gprof значительно недооценивает время выполнения программы?

У меня есть эта программа, которая занимает 2,34 секунды, и gprof говорит, что она занимает всего 1,18 секунды. Я читал ответы в другом месте, предполагая, что gprof может ошибиться, если, например, программа связана с вводом / выводом, но эта программа явно не так.

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

(Также в этом случае gprof говорит, что main() занимает более 100% времени выполнения программы, что является довольно глупой ошибкой, но не вызывает у меня проблем.)

$ cat test.c
int main() {
    int i;
    for (i=0;i<1000000000;i++);
}

$ gcc test.c -o test

$ time ./test

real    0m2.342s
user    0m2.340s
sys 0m0.000s

$ gcc test.c -o test -pg

$ time ./test

real    0m2.342s
user    0m2.340s
sys 0m0.000s

$ gprof test |head
Flat profile:

Each sample counts as 0.01 seconds.
  %   cumulative   self              self     total           
 time   seconds   seconds    calls  Ts/call  Ts/call  name    
101.33      1.18     1.18                             main

 %         the percentage of the total running time of the
time       program used by this function.

3 ответа

Я бы порекомендовал сбросить gprof и переключение на oprofile, Любое профилирование, которое вставляет инструментарий в вашу программу, неизбежно влияет на производительность способами, которые могут исказить или аннулировать результаты. С oprofile вам не нужно создавать свою программу с поддержкой профилирования или приобретать специальные библиотеки с поддержкой профилирования; он работает статистическими методами, в основном выбирая указатель инструкций (с помощью ядра) и используя счетчик выборок, чтобы оценить, сколько времени было потрачено на каждую функцию.

Во-первых, чтобы ответить на ваш вопрос, gprof не учитывает заблокированное время, поэтому, если в машине одновременно происходит что-то еще, вы увидите это несоответствие. Кроме того, если ваша программа выполняет какие-либо операции ввода-вывода, это также не учитывается.

gprof действительно полезно только для очень ограниченного класса программ. Вот список вопросов.

Прежде всего, профилирование программы, которая завершается за 2,3 секунды, немного нелепо. Вы действительно нуждаетесь в длительной программе, чтобы получить хорошее измерение горячих точек программы и т. Д. Но я отвлекся...

Чтобы ответить на ваш первый вопрос, время (утилита командной строки) умножает на выполнение всего процесса (включая сам инструмент профилирования). Когда вы включаете профилирование в вашей сборке, программа записывает файл gmon.out, содержащий время выполнения и т. Д. Каждый раз, когда вы запускаете программу. То есть тяжелая работа по профилированию выполняется каждый раз, когда вы запускаете программу. Инструментарий профилирования изо всех сил пытается отделить свое собственное влияние на учет времени, и в этом случае, по-видимому, само профилирование составило 2,34 - 1,18 = 1,16 с времени выполнения (как сообщалось по времени). Сама программа gprof, по сути, просто анализирует и переформатирует статистику времени выполнения, хранящуюся в программе gmon.out. Чтобы было ясно, реальное профилирование происходит во время выполнения вашей программы, а не во время выполнения gprof.

Наконец, вывод gprof напрямую отвечает на ваш второй вопрос. Это образец выполнения вашей программы в 1/100 сек. интервалы и дают кредит на эти целые 0,01 с тому, что произошло во время выборки. Если вашей программе не требуется точное кратное 0,01 секунды для выполнения, вы получите числа, которые не складываются до 100%. Опять же, следует подчеркнуть, что профилирование программы, которая запускает это быстро, весьма подвержено ошибкам, и эта очевидная ошибка, безусловно, будет смягчена более длительным интервалом выборки (т. Е. Временем выполнения). Кроме того, учет собственных накладных расходов в gprof несовершенен, что может привести к еще более нелепому показателю в 101,33%.

Это статистический процесс, и он не идеален. Вы должны интерпретировать результаты с зерном соли.

Удачи!

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