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