Estoy construyendo una gran cantidad de código generado automáticamente, incluyendo un archivo particularmente grande (~ 15K líneas), usando un compilador cruzado mingw32 en Linux. La mayoría de los archivos son extremadamente rápidos, pero este archivo grande tarda un tiempo inesperadamente largo (~ 15 minutos) en compilarse.¿Cómo puedo averiguar por qué g ++ tarda mucho tiempo en un archivo en particular?
He intentado manipular varias banderas de optimización para ver si tenían algún efecto, sin suerte. Lo que realmente necesito es alguna forma de determinar qué está haciendo g ++ que lleva tanto tiempo. ¿Hay alguna forma (relativamente simple) de generar resultados en g ++ sobre diferentes fases de la compilación, para ayudarme a reducir el problema?
Lamentablemente, no tengo la capacidad de reconstruir este compilador cruzado, por lo que no es posible agregar información de depuración al compilador y recorrerlo.
¿Qué hay en el archivo:
- un montón de incluye
- un montón de comparaciones de cadenas
- un montón de si-entonces los cheques y las invocaciones constructor
El archivo es una fábrica para producir una tonelada de diferentes subclases específicas de una cierta clase de padres. La mayoría de los incluyen, sin embargo, no son nada terriblemente elegante.
Los resultados de -ftime-informe, según lo sugerido por Neil Butterworth, indican que la fase de "análisis de la vida" está llevando a 921 segundos, que ocupa la mayor parte de los 15 minutos.
Parece que esto tiene lugar durante el análisis de flujo de datos. El archivo en sí es un conjunto de comparaciones de cadenas condicionales, que construyen un objeto por nombre de clase proporcionado como una cadena.
Creemos que cambiar esto para apuntar a un mapa de nombres para los indicadores de función puede mejorar un poco las cosas, así que vamos a intentar eso.
De hecho, la generación de un grupo de funciones de fábrica (por objeto) y crear un mapa a partir del nombre de cadena del objeto a un puntero a su función de reducción del tiempo de compilación de la fábrica a partir de los originales 15 minutos a aproximadamente 25 segundos, que ahorrará a todos toneladas de tiempo en sus compilaciones.
Gracias de nuevo a Neil Butterworth por la información sobre el informe de tiempo de actividad.
Eche un vistazo a esto: http: //stackoverflow.com/questions/318398/why-does-c-compilation-take-so-long –
¿Podría decirnos qué hay en el archivo? Funciones en línea? ¿Enumerados? Define? Incluye y listas de macros? ¿Cuantos de ellos? – Coincoin
¿Tiene el mismo problema si usa el compilador local? Si es así, podría reconstruirlo con el perfil habilitado para ver dónde se gasta el tiempo. –