Perfilado del proceso de comstackción de C ++

Tiendo a escribir bibliotecas en C ++ bastante grandes con plantillas solo de encabezado y mis usuarios comúnmente se quejan de los tiempos de comstackción. Después de pensar en el asunto, se me ocurrió que no tenía idea de a dónde iba el tiempo . ¿Hay alguna manera simple de perfilar el proceso de comstackción de C ++ con comstackdores comunes, como g ++, icc y xlC? Por ejemplo, ¿es posible tener una idea de cuánto tiempo se pasa dentro de cada una de las fases de la comstackción de C ++ ?

Para GCC hay opciones de depuración para encontrar how much time is spent within each of the phases of C++ comstacktion?

-Q Hace que el comstackdor imprima cada nombre de función a medida que se comstack, e imprime algunas estadísticas sobre cada pase cuando termina.

-file-report Hace que el comstackdor imprima algunas estadísticas sobre el tiempo consumido por cada pase cuando finaliza.

Los pases se describen en GCCINT 9: Pases y archivos del comstackdor .

Puede publicar el resultado de la comstackción g ++ del archivo de origen único con -v -ftime-report aquí para analizarlo . Podría haber algo de ayuda en la lista de correo de GCC.


Para comstackdores que no sean GCC (o GCC más antiguos que 3.3.6 ), vea las otras opciones en este hilo.

Hay una herramienta del proyecto Boost, que podría ser útil para prácticamente cualquier comstackdor y sistema de comstackción.

La herramienta requiere instrumentación de código fuente con TEMPLATE_PROFILE_ENTER() y TEMPLATE_PROFILE_EXIT() llamadas de macro. A continuación, estas macros generan diagnósticos específicos (advertencias) en tiempo de comstackción, que se cronometran y se recostackn junto con instancias de llamada de instanciación (que, en consecuencia, permiten construir y visualizar los callgraphs) mediante un script. No está mal, IMO.

Aunque no lo usé todavía.

Todavía no lo he probado, pero la luz parece muy prometedora: https://github.com/mikael-s-persson/templight

Puedes separarlos en cierta medida (supongo que make )

  • agregue una regla de comstackción que solo preproceses los archivos (utilizando el .PHONY -E ), y un destino .PHONY que dependa de los archivos de salida del preprocesador al igual que el destino binario normal depende de los archivos .o . Mida cuánto tiempo lleva construir este objective
  • agrega un 'PHONY objective 'PHONY que depende de todos los archivos .o pero no los vincula. Mida cuánto tiempo lleva construir este objective (desde limpio)
  • medir cuánto tiempo lleva hacer una comstackción limpia del binario habitual

Ahora tiene una idea de cuánto tiempo lleva preprocesar, comstackr y vincular. También puede comparar versiones optimizadas y no optimizadas ( -O0 ) del segundo y tercer objective, para ver cuánto tiempo se pasa en el optimizador.

Es posible que pueda obtener cierta tracción con alguna variante en strace -e trace=process -f -r -ttt -T , al menos para comstackdores como g ++ que se dividen en muchos procesos.