Подтвердить что ты не робот

Как работает gprof?

Это что-то вроде раздутого вопроса, поэтому я заранее извиняюсь. Мне интересно, как gprof работает на низком техническом уровне. Я понимаю, что это делается таймерами, но почему тогда необходимо, чтобы исполняемый файл был специально скомпилирован для профилирования? Выделяет ли компиляция пространство для статистики?

Кроме того, как выполняется точное время?

4b9b3361

Ответ 1

Ну, это дает хорошее объяснение. Также объясняется статистическое профилирование

По существу gprof изменит исполняемый файл вашей программы (это называется инструментом для кода) для хранения некоторой информации о бухгалтерском учете, например. сколько раз вызывается функция.

Статистический бит профилирования поступает из регулярного отслеживания счетчика программ, чтобы получить образец того, что делает ваш код.

Gprof делает оба. Он обрабатывает код и собирает образцы, просматривая счетчик программ.

Ответ 2

Имея только прочитайте статью (снова), позвольте мне попытаться объяснить это.

Предположим, что он принимает образцы на частоте 100 Гц, за исключением случаев, когда процесс блокируется для ввода-вывода или по какой-либо другой причине. Каждый образец записывает ПК, который находится в некоторой функции. Количество отсчетов в этой функции увеличивается.

Итак, в конце прогона, если было (скажем) 1000 выборок, это означает, что общее время выполнения (только для процессора) составляло 10 секунд. Если процедура B записала, скажем, 500 из этих выборок, это означает, что ее общее время выполнения составляет 1/2 от общего количества или 5 секунд. Это время, потому что компьютер находится в нем. Это не говорит о том, сколько времени требуется для выполнения, в среднем. Чтобы сказать это, вам нужно знать, сколько раз он был вызван. Кроме того, это не включает время, проведенное в опросах.

Когда код скомпилирован с флагом -pg, в каждый рутинный код ввода вставлен специальный вызов. Это замечает, что введена процедура B, и она замечает, что она вызывается с сайта вызова в подпрограмме A. Существует таблица, индексированная этим сайтом, где этот вызов можно подсчитать. Итак, в конце gprof может указать, сколько раз B было вызвано в общей сложности, и сколько из них было от A.

Чтобы получить среднее время автономной работы B, его общее время автономной работы делится на количество раз, когда оно вызывается.

Чтобы получить общее кумулятивное время (self plus callees) подпрограммы A, gprof нуждается в самообслуживании A, плюс общее количество раз, которое он вызывает каждую подчиненную процедуру B, умноженное на среднее суммарное время B. Это число затем делится на общее количество вызовов на A, чтобы получить среднее суммарное время A.

Звучит неплохо, пока рекурсия не войдет в картину, где она становится еще более запутанной.

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