Почему в циклических сводках нет вызовов в выводе графа вызовов gprof? - PullRequest
2 голосов
/ 08 мая 2009

Я использую GNU gprof 2.15.94.0.2.2 для профилирования моей программы на C ++, которая имеет большие циклы вызовов. Я ожидал увидеть что-то подобное в выводе графа вызовов, так как документация gprof указывает :

index  % time    self  children called     name
----------------------------------------
                 1.77        0    1/1        main [2]
[3]     91.71    1.77        0    1+5    <cycle 1 as a whole> [3]
                 1.02        0    3          b <cycle 1> [4]
                 0.75        0    2          a <cycle 1> [5]
                    0        0    6/6        c [6]
----------------------------------------

Однако ни в одной из моих <cycle as a whole> записей нет перечисленных абонентов. Они все такие:

index  % time    self  children called             name
----------------------------------------------
[8]     65.6    259.55  5342.63  9334767+60122608 <cycle 2 as a whole> [8]
                133.28  2051.45  12043564+74015448    foo <cycle 2> [14]
                18.90   976.38   2379645              bar <cycle 2> [21]
...                                                                      
-----------------------------------------------

Поскольку мои циклы довольно велики, очень трудно отследить вызывающих по отдельным функциям в цикле.

Может кто-нибудь сказать мне, почему вызывающие циклы отсутствуют в выводе, и как заставить их отображаться?

Ответы [ 3 ]

1 голос
/ 24 ноября 2009

Использует ли ваше приложение многопоточность? gprof вообще не работает с потоками. В противном случае, вы, скорее всего, ошиблись в gprof. Это ошибка и устарела. Лучше использовать что-то вроде oprofile или valgrind.

0 голосов
/ 23 ноября 2009

Это ваша главная задача, или у вас есть более важная цель, например, попытаться найти вещи, которые вы можете оптимизировать? Обычно именно поэтому люди используют gprof .

gprof это то, что есть, но вы можете добиться большего успеха.

0 голосов
/ 23 ноября 2009

Я собираюсь пойти так далеко, чтобы назвать это ошибкой в ​​gprof. Я создал простой пример взаимно рекурсивных функций и получил то же поведение, что и вы. У меня были функции:

int a(int n){return b(n);}
int b(int n){return c(n);}
int c(int n){return (n==0)?n:a(n-1);}

и основной ():

for(int j=0; j <1000; ++j)
  for(int i=0; i < 10; ++i)
     cout << a(i);

Я попытался заменить вызов a () на:

int d(int n){return a(n);}

в надежде, что gprof зарегистрирует вызов цикла из d () лучше, чем вызов main (), но я получил тот же результат.

Я также заменил cout на printf () и создал программу на C, с теми же результатами, что и для вызывающего абонента.

...