Gprof - это инструмент анализа производительности для приложений Unix. Он использовал гибрид инструментальных средств и семплирования и был создан как расширенная версия более старого инструмента "prof". В отличие от prof, gprof поддерживает сбор и печать ограниченного графика вызовов.
GPROF изначально был написан группой, возглавляемой Сьюзен Л. Грэм в Калифорнийский университет в Беркли для Berkeley Unix (4.2BSD ). Другая реализация была написана Джеем Фенласоном как часть проекта GNU для GNU Binutils в 1988 году.
Инструментальный код автоматически вставляется в программный код во время компиляции (например, с использованием параметра '-pg
' компилятора gcc ) для сбора данных вызывающей функции. Вызов функции монитора 'mcount' вставляется перед каждым вызовом функции.
Данные выборки сохраняются в файле 'gmon.out' или в файле 'progname.gmon' непосредственно перед выходом из программы и могут быть проанализированы с помощью инструмента командной строки 'gprof
'. Несколько файлов gmon можно объединить с помощью 'gprof -s
' для сбора данных из нескольких запусков программы.
Вывод GPROF состоит из двух частей: плоского профиля и графика звонков. Плоский профиль показывает общее время выполнения каждой функции и его процент от общего времени выполнения. Также сообщается количество вызовов функций. Выходные данные сортируются по проценту, с горячими точками вверху списка.
Вторая часть вывода - это текстовый график вызовов, который показывает для каждой функции, которая ее вызвала (родительская) и кого она вызвала (дочерние подпрограммы). Существует внешний инструмент под названием gprof2dot, способный преобразовывать график вызовов из gprof в графическую форму.
Во время выполнения значения времени получаются путем статистической выборки. Выборка осуществляется путем проверки счетчика программ программы целевой программы через регулярные промежутки времени с использованием прерываний операционной системы (программируются через profil (2) или setitimer (2) системные вызовы ). Полученные данные не точные, а скорее статистическое приближение. Сумма ошибки обычно составляет более одного периода выборки. Если значение в n раз превышает период выборки, ожидаемая ошибка в значении является квадратным корнем из n периодов выборки. Типичный период выборки составляет 0,01 секунды (10 миллисекунд) или 0,001 секунды (1 мс), или, другими словами, 100 или 1000 выборок в секунду времени работы ЦП.
В некоторых версиях, таких как BSD, профилирование разделяемых библиотек может быть ограничено из-за ограничений функции profil, которая может быть реализована как библиотечная функция или как системный вызов. В glibc была аналогичная утилита под названием sprof для профилирования динамических библиотек.
Gprof не может измерять время, проведенное в режиме ядра (системные вызовы, ожидание ЦП или ожидание ввода-вывода), и только код пользовательского пространства профилируется.
Функция mcount может быть небезопасной в некоторых реализациях, поэтому профили многопоточных приложений могут быть неверными (обычно она профилирует только основной поток
Накладные расходы на инструментальные средства могут быть высокими (примерно 30–260%) для высокоуровневых или объектно-ориентированных программ. Взаимная рекурсия и нетривиальные циклы не разрешаются с помощью подхода gprof (контекстно-независимый граф вызовов), потому что он записывает только обход дуги, а не полные цепочки вызовов.
Gprof со сбором графа вызовов может использоваться только с совместимыми компиляторами, такими как GCC, clang / LLVM и некоторыми другими.
В 2004 году статья GPROF появилась в списке 50 самых влиятельных PLDI статей всех времен как одна из четырех статей 1982 год.
По словам Тиля, «GPROF... произвел революцию в области анализа производительности и быстро стал инструментом, который выбирают разработчики по всему миру... инструмент по-прежнему имеет большое количество поклонников... инструмент по-прежнему активно поддерживается и остается актуальным в современном мире ».