Предположим, у вас есть эта программа:
main () вызывает A (), вызывает B (), вызывает C (), и C зависает в цикле на 10 секунд.
Профилировщик процессора скажет что-то вроде этого:
total time: 10 sec
routine self% inclusive%
main 0 100
A 0 100
B 0 100
C 100 100
Собственное время C будет 10 секунд, 100%. Собственное время других было бы практически нулевым.
Общее (включительно) время каждого из них составит 10 секунд или 100%. Вы не складываете их.
С другой стороны, предположим, что C тратит 10 секунд на ввод / вывод.
Тогда профилировщик только для процессора скажет что-то вроде этого:
total time: 0 sec
routine self% inclusive%
main ? ?
A ? ?
B ? ?
C ? ?
потому что единственное фактическое время ЦП, которое он использует, настолько мало, что сэмплы практически не попадают в него, поэтому, чтобы получить проценты, которые он делит на ноль.
OTOH, если сэмплы были на часах настенного времени, вы получили бы первый вывод.
Лучшим типом профилировщика является тот, который производит выборку стека вызовов по настенным часам и сообщает вам включенное время в процентах от общего, а также дает его вам на уровне строки кода, а не только для функций. Это полезно, потому что это прямая мера того, сколько можно было бы сэкономить, если бы строка выполнялась меньше, и от нее почти невозможно было спрятаться. Примерами таких профилировщиков являются Zoom и LTProf , и мне сказали, что OProfile может это сделать. Существует простой метод , который работает с любым языком и требует только отладчик.
Вот обсуждение вопросов.