2010-03-30 38 views
13

Nota: mi pregunta no es: ¿cómo le digo a mi compilador que compile con el perfil?C++ g ++ llvm-clang perfil de compilador

Quiero perfil my compila el proceso. Para cada archivo, me gustaría saber cuánto tiempo se gasta en cada línea del programa.

Estoy trabajando en un proyecto, algunos archivos tienen grandes tiempos de compilación, estoy tratando de descubrir por qué.

¿Hay alguna forma de hacerlo con g ++ o llvm-clang?

Gracias!

Salida de -v-informe de tiempo (¿qué significa eso?)

En el siguiente, ¿es "analizador" o "expandir" el uso de plantillas?

Execution times (seconds) 
    callgraph construction: 0.06 (2%) usr 0.00 (0%) sys 0.09 (2%) wall 3181 kB (1%) ggc 
    callgraph optimization: 0.05 (2%) usr 0.00 (0%) sys 0.05 (1%) wall 5243 kB (2%) ggc 
    cfg cleanup   : 0.02 (1%) usr 0.00 (0%) sys 0.02 (0%) wall  11 kB (0%) ggc 
    df live regs   : 0.01 (0%) usr 0.00 (0%) sys 0.01 (0%) wall  0 kB (0%) ggc 
    df reg dead/unused notes: 0.03 (1%) usr 0.00 (0%) sys 0.03 (1%) wall 1993 kB (1%) ggc 
    register information : 0.04 (1%) usr 0.00 (0%) sys 0.04 (1%) wall  0 kB (0%) ggc 
    alias analysis  : 0.01 (0%) usr 0.00 (0%) sys 0.01 (0%) wall  450 kB (0%) ggc 
    rebuild jump labels : 0.03 (1%) usr 0.00 (0%) sys 0.03 (1%) wall  0 kB (0%) ggc 
    preprocessing   : 0.12 (4%) usr 0.06 (12%) sys 1.46 (27%) wall 2752 kB (1%) ggc 
    parser    : 0.67 (21%) usr 0.15 (29%) sys 0.89 (16%) wall 91749 kB (36%) ggc 
    name lookup   : 0.15 (5%) usr 0.12 (24%) sys 0.24 (4%) wall 14384 kB (6%) ggc 
    inline heuristics  : 0.03 (1%) usr 0.00 (0%) sys 0.03 (1%) wall  0 kB (0%) ggc 
    tree gimplify   : 0.06 (2%) usr 0.01 (2%) sys 0.09 (2%) wall 15992 kB (6%) ggc 
    tree eh    : 0.02 (1%) usr 0.01 (2%) sys 0.03 (1%) wall 4405 kB (2%) ggc 
    tree CFG construction : 0.01 (0%) usr 0.01 (2%) sys 0.03 (1%) wall 6636 kB (3%) ggc 
    tree CFG cleanup  : 0.02 (1%) usr 0.01 (2%) sys 0.02 (0%) wall  15 kB (0%) ggc 
    tree find ref. vars : 0.00 (0%) usr 0.00 (0%) sys 0.00 (0%) wall 1870 kB (1%) ggc 
    tree SSA rewrite  : 0.01 (0%) usr 0.00 (0%) sys 0.01 (0%) wall 2357 kB (1%) ggc 
    tree SSA other  : 0.00 (0%) usr 0.01 (2%) sys 0.00 (0%) wall  37 kB (0%) ggc 
    tree operand scan  : 0.01 (0%) usr 0.04 (8%) sys 0.06 (1%) wall 6340 kB (2%) ggc 
    tree SSA to normal : 0.05 (2%) usr 0.00 (0%) sys 0.05 (1%) wall  95 kB (0%) ggc 
    dominance computation : 0.04 (1%) usr 0.00 (0%) sys 0.04 (1%) wall  0 kB (0%) ggc 
    expand    : 0.60 (18%) usr 0.03 (6%) sys 0.71 (13%) wall 45557 kB (18%) ggc 
    varconst    : 0.02 (1%) usr 0.00 (0%) sys 0.02 (0%) wall 3532 kB (1%) ggc 
    jump     : 0.00 (0%) usr 0.00 (0%) sys 0.00 (0%) wall 1745 kB (1%) ggc 
    mode switching  : 0.01 (0%) usr 0.00 (0%) sys 0.01 (0%) wall  0 kB (0%) ggc 
    integrated RA   : 0.35 (11%) usr 0.00 (0%) sys 0.35 (6%) wall 5259 kB (2%) ggc 
    reload    : 0.29 (9%) usr 0.01 (2%) sys 0.31 (6%) wall 6490 kB (3%) ggc 
    thread pro- & epilogue: 0.10 (3%) usr 0.01 (2%) sys 0.13 (2%) wall 4832 kB (2%) ggc 
    final     : 0.19 (6%) usr 0.01 (2%) sys 0.21 (4%) wall 2985 kB (1%) ggc 
    symout    : 0.25 (8%) usr 0.01 (2%) sys 0.26 (5%) wall 27322 kB (11%) ggc 
    TOTAL     : 3.25    0.51    5.49    256741 kB 
+0

Esto es lo mejor que se puede conseguir. Es imposible ver el tiempo de las líneas individuales de C++, pero aquí puede ver si el problema es con el preprocesador, el analizador o cualquiera de los otros pasos del compilador. Su archivo fue compilado en solo 3.25 segundos. – bitc

Respuesta

7

intente estas opciones de línea de comandos con g ++

-v--ftime informe

Eso te dará más información sobre el proceso de compilación. El culpable es generalmente plantillas sin embargo.

+0

Como último recurso, puede comentar cosas con el fin de encontrar lo que está tomando más tiempo. – bitc

1

Para la línea de preprocesamiento sugerencia un poco más largo:

"0,12 (4%) usr 0,06 (12%) sys 1,46 (27%) de pared" - esta línea dice, que preprocesamiento era hacer pequeño trabajo en la CPU en sí mismo (0.12), pero utiliza llamadas de sistema bastante pesadas (0.06 o 50% del tiempo de CPU del usuario) y la mayor parte del tiempo no se desperdició en la CPU (1.46 tiempo real >> 0.18 s tiempo de CPU). Entonces, este tiempo se desperdició al esperar una operación de E/S O al esperar la CPU en el sistema ocupado. ¿Fue este el único programa de trabajo en la máquina?

Para E/S puede hacer: agregar noatime a fs para disminuir el número de I/O reqs, comprar más rápido (en términos de menor tiempo de búsqueda o mayor IO rate) HDD, mover fuentes a SSD o incluso RAM- unidad (dispositivo de bucle). Y no puedes hacer una desfragmentación, porque es Linux.

Para significado de pase eash, utilice http://gcc.gnu.org/onlinedocs/gccint/Passes.html#Passes

+0

Para el significado de las líneas: breve introducción en gcc http://www.cse.iitb.ac.in/~uday/gcc-mini-workshop/gcc-internals-1.pdf Presentación sobre RTL http: //www.cse .iitb.ac.in/grc/gcc-workshop-09/downloads/gccw09-rtl.pdf – osgx

Cuestiones relacionadas