Вперед Назад Содержание

8. Реализация профилирования

Профилирование работает на изменениях, которые делает компилятор, когда компилирует вашу программу с опцией `-pg'. Каждая функция в вашей программе откомпилирована так, чтобы при своем вызове она порождала некоторую информацию о том, откуда она была вызвана. Отсюда профилятор может выяснить, какая функция ее вызвала, и сможет подсчитать, сколько раз она была вызвана.

Профилирование также подключает отслеживание того, как выполняется ваша программа, и снимает гистограмму, где (по какому адресу) находился программный счетчик. Обычно программный счетчик опрашивается около 100 раз в секунду, но точная частота может отличаться от системы к системе.

Специальная процедура запуска выделяет память под накопление гистограммы и устанавливает обработчик сигнала от часов для занесения записей в нее. Применение этой специальной процедуры запуска обусловлено использованием `gcc ... -pg' для сборки (линковки). Также в этом файле содержится функция `exit', ответственная за запись файла `gmon.out'.

Информация о количестве вызовов для библиотечных функций накапливается при использовании специальной версии Си-библиотеки. Функции в ней точно такие же, как и в обычной библиотеке, но откомпилированы с опцией `-pg'. Если вы собираете (линкуете) вашу программу через `gcc ... -pg', то автоматически будет использована профилирующая версия библиотеки.

Вывод `gprof' не отметит, какие части вашей программы ограничены пропускной способностью ввода/вывода или свопинга. Это потому, что отсчеты с программного счетчика снимаются через фиксированные интервалы времени исполнения программы. Следовательно, замеры времени в выводе `gprof' ничего не скажут про время, в течении которого ваша программа не выполнялась. Например, часть программы, создающая очень много данных, не может вместить их всех разом в физическую память, и будет исполнятся очень медленно, но `gprof' будет сообщать, что она занимает немного времени. С другой стороны, ведение отсчета по времени исполнения имеет то преимущество, что нагрузка, создаваемая другими пользователями, не должна оказывать непосредственного влияния на полученные при профилировании данные.


Вперед Назад Содержание