Время `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
и выбор функции позволит вам построчно получить информацию о том, сколько времени ЦП затрачивается внутри функции.