gprof — уважаемый и новаторский инструмент.
Но вы обнаружите, что это очень ограничено. Он основан на выборке счетчика программ, а также на подсчете вызовов между функциями, все из которых имеют очень незначительную связь с затратами времени.
Узнать, что стоит время в вашей программе, на самом деле довольно просто. Я и другие используют этот метод.
Дело в том, что во время выполнения программы существует стек вызовов, состоящий из текущего счетчика программ, а также обратного адреса для каждой инструкции вызова функции, которая в данный момент находится в процессе выполнения в потоке.
Если вы можете сделать рентгеновский снимок стека вызовов в произвольный момент времени и изучить все его уровни в контексте отладчика, вы сможете точно сказать, что он пытался сделать и почему в этот момент времени. время.
Если он тратит 30% своего времени на то, о чем вы никогда не догадывались, но что вам на самом деле не нужно, вы обнаружите его в 3 из 10 образцов стека, более или менее, и этого достаточно, чтобы найти его. Вы не будете точно знать, каков процент, но вы будете точно знать, в чем проблема.
Время, которое стоит любая инструкция (время, которое вы бы сэкономили, если бы избавились от нее) — это просто процент времени, в течение которого она находится в стеке, будь то инструкция без вызова или инструкция вызова. Если это стоит достаточно времени, чтобы его можно было исправить, оно проявится в умеренном количестве образцов.
ДОБАВЛЕНО: Не буду заморачиваться, но всегда найдется кто-то, кто скажет: «Слишком мало сэмплов, он найдет не тот материал!» Ладно. Предположим, вы берете десять случайных выборок из стека и видите что-то, от чего можно избавиться в трех из них. Сколько это стоит? Ну ты точно не знаешь. Он имеет распределение вероятностей, которое выглядит точно так:
Вы можете видеть, что наиболее вероятная стоимость составляет 30% (неудивительно) для ускорения 10/7 = 1,4x, но она будет больше или меньше. Насколько больше или меньше? Что ж, чистое пространство между двумя заштрихованными областями соответствует 95% вероятности. Другими словами, да есть шанс, что стоимость будет меньше 10%, а именно около 2,5%. Если стоимость составляет 10%, ускорение составляет 10/9 = 1,1x. С другой стороны, существует равная вероятность того, что стоимость выше 60% для ускорения 10/4 = 2,5x.
Таким образом, расчетное ускорение равно 1,4, но хотя оно может быть и 1,1, не стоит сбрасывать со счетов равную вероятность того, что оно может достигать 2,5. Конечно, если взять 20 проб вместо 10, кривая будет уже.
person
Mike Dunlavey
schedule
22.05.2014
gprof
. Он говорит вам собственное время, и это бесполезно. См. этот ответ. Общие комментарии относятся к вашей ситуации. (Если программа работает слишком быстро для сэмплирования, зациклите ее.) - person Mike Dunlavey   schedule 21.05.2014