Цифры времени исполнения, которые вам выдает `gprof', основываются на процессе наблюдения, и это повод для возникновения статистических неточностей. Когда функция выполняется слишком короткий промежуток времени, наблюдающий процесс в среднем может поймать ее за работой только однажды, а это--очаровательная возможность считать, что эта функция не наблюдалась вообще или ее видели дважды.
В отличие от этого, цифры количества вызовов получаются подсчетом, а не наблюдением. Они точны и не меняются от запуска к запуску, если ваша программа детерминирована (ход ее исполнения строго предопределен).
Период наблюдения (отсчета), который выводится в начале простого профиля, говорит, как часто происходят наблюдения. Правило большого пальца утверждает, что цифры времени исполнения точны, если они значительно больше периода отсчета (наблюдения).
Обычно реальная ошибка превышает один период наблюдения. Фактически, если значение равно N периодам наблюдения, то *ожидаемая* ошибка не превышает корня квадратного из N. Если период наблюдения равен 0.01 сек., а время выполнения `foo' равно 1.00 сек., то ожидаемая ошибка в величине времени выполнения `foo' не превышает 0.10 сек. Весьма вероятно, что это время будет заметно изменяться *в среднем* от запуска к запуску для профилирования. (*Иногда* оно будет меняться гораздо сильнее).
Это не означает, что маленькие цифры содержат недостоверную информацию. Если *общее* время исполнения программы велико, то маленькое время выполнения для одной функции скажет вам, что эта функция использует незначительную долю от всего времени исполнения программы. Обычно это означает, что вам незачем беспокоится об оптимизации.
Есть один способ добиться большей точности--задать вашей программе побольше (но попроще) входных данных, чтобы она подольше поработала. Другой способ--собрать данные от разных запусков, используя опцию `-s' `gprof'. Вот так:
gprof -s EXECUTABLE-FILE gmon.out gmon.sum
gprof EXECUTABLE-FILE gmon.sum > OUTPUT-FILE