Просто прочитав статью (снова), позвольте мне попробовать чтобы объяснить это.
Предположим, он берет образцы на частоте 100 Гц, за исключением случаев, когда процесс заблокирован для ввода-вывода или по какой-либо другой причине. Каждый образец записывает ПК, который выполняет какую-либо функцию. Счетчик выборок в этой функции увеличивается.
Итак, в конце прогона, если было (скажем) 1000 выборок, это означает, что общее время выполнения (только для ЦП) составило 10 секунд. Если подпрограмма B записала, скажем, 500 из этих выборок, это означает, что ее общее время выполнения составляет 1/2 от общего количества, или 5 секунд. Это его собственное время, потому что в нем находится ПК. Это не говорит о том, сколько времени в среднем занимает выполнение. Чтобы это сказать, вам нужно знать, сколько раз он был вызван. Также сюда не входит время, проведенное в вызываемых абонентах.
Когда код компилируется с флагом -pg, в код входа каждой подпрограммы вставляется специальный вызов. Это замечает, что введена процедура B, и замечает, что она вызывается с места вызова в подпрограмме A. Существует таблица, проиндексированная этим участком вызова, где этот вызов может быть подсчитан. В конце концов, gprof может сказать, сколько раз B был вызван в целом, и сколько из них было из A.
Чтобы получить среднее собственное время B, его общее собственное время делится на количество вызовов.
Чтобы получить общее кумулятивное время (собственное плюс вызываемые) подпрограммы A, gprof требуется собственное время A плюс общее количество вызовов каждой подчиненной подпрограммы B, умноженное на среднее совокупное время B. разделенное на общее количество вызовов A, чтобы получить среднее суммарное время A.
Звучит хорошо, пока рекурсия не войдет в картину, где это станет еще более запутанным.
Все это очень умно и, как отмечают авторы, полно оговорок.
person
Mike Dunlavey
schedule
18.02.2011