2012-03-07 14 views
5

He estado usando el generador de perfiles gprof junto con g++.`gprof` tiempo pasado en líneas particulares de código

Tengo una función en mi código que encapsula varias secciones de comportamiento que están lo suficientemente relacionadas con la función principal que no tendría sentido dividirlas en sus propias funciones.

Me gustaría saber cuánto tiempo se gasta en cada una de estas áreas de código.

Por lo tanto, si se imagina el código es el

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

donde A, B, y C representan determinadas secciones del código que me interesa, es que hay una manera de conseguir gprof a decirme cuánto ¿Cuánto tiempo pasa trabajando en esas secciones en particular?

+2

Si usted está tratando de hacer que el programa funcione más rápido, * [se puede hacer mejor que gprof.] (Http://stackoverflow.com/questions/1777556/alternatives-to-gprof/1779343#1779343) * –

Respuesta

2

Aquí hay un recurso útil para usted: gprof line by line profiling.

Con versiones anteriores del compilador gcc, el argumento gprof -l especificó el perfilado de línea por línea.

Sin embargo, las versiones más nuevas de gcc utilizan la herramienta gcov en lugar de gprof para mostrar información de perfil línea a línea.

2

Si está utilizando Linux, entonces se puede utilizar Linux Potencia del lugar de gprof, como se describe aquí:

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

Typing perf report y seleccionar una función le permitirá obtener línea por línea de información acerca de dónde se gasta el tiempo de CPU dentro de la función.

6

Sé que es una vieja pregunta, pero he encontrado una respuesta interesante. Como dice Sam, la opción -l es solo para el compilador gcc antiguo. Pero he encontrado que si compila y vincula con -pg -fprofile-arcs -ftest-coverage, ejecuta el programa, el resultado de gprof -l es muy interesante.

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) 

Es decir el tiempo que pasó por línea. Es un resultado muy interesante. No sé la precisión o la validez de eso, pero es bastante interesante. espero que sea ayudar

Cuestiones relacionadas