Время `gprof`, потраченное на определенные строки кода

Я использую gprof профилировщик в сочетании с g++,

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

Я хотел бы знать, сколько времени тратится на каждую из этих областей кода.

Итак, если вы представляете, что код выглядит

function(){
    A
    A
    A
    B
    B
    B
    C
    C
    C
}

где A, B и C представляют определенные части кода, которые меня интересуют, есть ли способ получить gprof сказать мне, сколько времени уходит на работу над этими конкретными разделами?

3 ответа

Я знаю, что это старый вопрос, но я нашел интересный ответ. Как Сэм говорит, -l опция только для старого компилятора gcc. Но я обнаружил, что если вы компилируете и связываете с -pg -fprofile-arcs -ftest-coverage, запустите программу, результат gprof -l очень интересно.

Flat profile:

Each sample counts as 0.01 seconds.
  %   cumulative   self              self     total           
 time   seconds   seconds    calls  Ts/call  Ts/call  name    
 13.86      0.26     0.26                             main (ComAnalyste.c:450 @ 804b315)
 10.87      0.46     0.20                             main (ComAnalyste.c:386 @ 804b151)
  7.07      0.59     0.13                             main (ComAnalyste.c:437 @ 804b211)
  6.25      0.70     0.12                             main (ComAnalyste.c:436 @ 804b425)
  4.89      0.79     0.09                             main (ComAnalyste.c:283 @ 804a3f4)
  4.89      0.88     0.09                             main (ComAnalyste.c:436 @ 804b1e9)
  4.08      0.96     0.08                             main (ComAnalyste.c:388 @ 804ad95)
  3.81      1.03     0.07                             main (ComAnalyste.c:293 @ 804a510)
  3.53      1.09     0.07                             main (ComAnalyste.c:401 @ 804af04)
  3.26      1.15     0.06                             main (ComAnalyste.c:293 @ 804a4bf)
  2.72      1.20     0.05                             main (ComAnalyste.c:278 @ 804a48d)
  2.72      1.25     0.05                             main (ComAnalyste.c:389 @ 804adae)
  2.72      1.30     0.05                             main (ComAnalyste.c:406 @ 804aecb)
  2.45      1.35     0.05                             main (ComAnalyste.c:386 @ 804ad6d)
  2.45      1.39     0.05                             main (ComAnalyste.c:443 @ 804b248)
  2.45      1.44     0.05                             main (ComAnalyste.c:446 @ 804b2f4)
  2.17      1.48     0.04                             main (ComAnalyste.c:294 @ 804a4e4)
  2.17      1.52     0.04                             main (ComAnalyste.c:459 @ 804b43b)
  1.63      1.55     0.03                             main (ComAnalyste.c:442 @ 804b22d)
  1.63      1.58     0.03                             main (ComAnalyste.c:304 @ 804a56d)
  1.09      1.60     0.02                             main (ComAnalyste.c:278 @ 804a3b3)
  1.09      1.62     0.02                             main (ComAnalyste.c:285 @ 804a450)
  1.09      1.64     0.02                             main (ComAnalyste.c:286 @ 804a470)
  1.09      1.66     0.02                             main (ComAnalyste.c:302 @ 804acdf)
  0.82      1.67     0.02                             main (ComAnalyste.c:435 @ 804b1d2)
  0.54      1.68     0.01                             main (ComAnalyste.c:282 @ 804a3db)
  0.54      1.69     0.01                             main (ComAnalyste.c:302 @ 804a545)
  0.54      1.70     0.01                             main (ComAnalyste.c:307 @ 804a586)
  0.54      1.71     0.01                             main (ComAnalyste.c:367 @ 804ac1a)
  0.54      1.72     0.01                             main (ComAnalyste.c:395 @ 804ade6)
  0.54      1.73     0.01                             main (ComAnalyste.c:411 @ 804aff8)
  0.54      1.74     0.01                             main (ComAnalyste.c:425 @ 804b12a)
  0.54      1.75     0.01                             main (ComAnalyste.c:429 @ 804b19f)
  0.54      1.76     0.01                             main (ComAnalyste.c:444 @ 804b26f)
  0.54      1.77     0.01                             main (ComAnalyste.c:464 @ 804b4a1)
  0.54      1.78     0.01                             main (ComAnalyste.c:469 @ 804b570)
  0.54      1.79     0.01                             main (ComAnalyste.c:472 @ 804b5b9)
  0.27      1.80     0.01                             main (ComAnalyste.c:308 @ 804a5a3)
  0.27      1.80     0.01                             main (ComAnalyste.c:309 @ 804a5a9)
  0.27      1.81     0.01                             main (ComAnalyste.c:349 @ 804a974)
  0.27      1.81     0.01                             main (ComAnalyste.c:350 @ 804a99c)
  0.27      1.82     0.01                             main (ComAnalyste.c:402 @ 804af1d)
  0.27      1.82     0.01                             main (ComAnalyste.c:416 @ 804b073)
  0.27      1.83     0.01                             main (ComAnalyste.c:417 @ 804b0a1)
  0.27      1.83     0.01                             main (ComAnalyste.c:454 @ 804b3ec)
  0.27      1.84     0.01                             main (ComAnalyste.c:461 @ 804b44a)
  0.27      1.84     0.01                             main (ComAnalyste.c:462 @ 804b458)

Это говорит о времени, потраченном на строку. Это очень интересный результат. Я не знаю точность или обоснованность этого, но это довольно интересно. Надеюсь, это поможет

Вот полезный ресурс для вас: gprof построчное профилирование.

В старых версиях компилятора gcc gprof -l аргумент указан построчным профилированием.

Тем не менее, более новые версии GCC используют gcov инструмент вместо gprof отображать построчное профилирование информации.

Если вы используете linux, вы можете использовать linux perf вместо gprof, как описано здесь:

http://code.google.com/p/jrfonseca/wiki/Gprof2Dot

Typing perf report и выбор функции позволит вам построчно получить информацию о том, сколько времени ЦП затрачивается внутри функции.

Другие вопросы по тегам