Позвольте мне просто предложить, как бы я справился с этим, предполагая, что у вас есть исходный код.
Знание того, как долго функция занимает включительно для вызова ( включая I / O ), в среднем, умноженное на количество вызовов, разделенное на общее время выполнения, даст вам долю времени под управлением этой функции.Эта фракция - то, как вы узнаете, достаточно ли времени для оптимизации.Получить информацию из gprof .
не так просто. Другим способом узнать, какая доля включенного времени расходуется под управлением каждой функции, является временная или случайная выборка из стека вызовов.Если функция появляется на доли X выборок (даже если она появляется более одного раза в выборке), то X - это временная доля, которую она берет (в пределах погрешности).Более того, это дает вам на линию долю времени, а не просто на функцию .
Эта часть X является самой ценной информацией, которую вы можете получить, потому чтоэто общее количество времени, которое вы могли бы потенциально сэкономить, оптимизировав эту функцию или строку кода.
Zoom profiler - хороший инструмент для получения этой информации.
Я хотел бы обернуть длительный цикл вокруг кода верхнего уровня, чтобы он выполнялся многократно, достаточно долго, чтобы занять не менее нескольких секунд.Затем я вручную выбрал бы стек, прерывая или останавливая его наугад.На самом деле требуется всего несколько выборок, например 10 или 20, чтобы получить действительно четкое представление о наиболее трудоемких функциях и / или строках кода.
Вот пример.
PS Если вы беспокоитесь о статистической точности, позвольте мне получить количественную.Если функция или строка кода находится в стеке ровно в 50% случаев, и вы берете 10 выборок, то число выборок, показывающих это, будет 5 +/- 1,6 с погрешностью 16%.Если фактическое время меньше или больше, предел погрешности уменьшается.Вы также можете уменьшить предел погрешности, взяв больше образцов.Чтобы получить 1,6%, возьмите 1000 образцов.На самом деле, как только вы нашли проблему, вам решать, нужно ли вам меньше погрешности.