21

Quiero reducir el tiempo de compilación de un gran proyecto de C++. Intenté usar encabezados precompilados, interfaz, etc. Pero antes de continuar, quiero saber si hay alguna herramienta que ayude a detectar por qué el tiempo de compilación es tan largo. Alguien sugiere pc-lint y daré una oportunidad. How should I detect unnecessary #include files in a large C++ project? Pero si hay otras herramientas que analizan el tiempo de compilación y hablan sobre cualquier sugerencia para aumentar la velocidad de compilación, háganmelo saber. Gracias de antemano.¿Cómo debo detectar el cuello de botella del tiempo de compilación en un gran proyecto de C++?

Medio Ambiente: Microsoft Visual Studio C++ 2008 o 2010.

+1

directamente una respuesta, pero se volvió acumulación paralelo? – dbrank0

+0

El comentario general es no incluir encabezados que no necesita. Lo peor para el tiempo de compilación es un archivo de encabezado llamado includes.hpp que incluye todos los posibles archivos de encabezado que necesita. He visto ese tiempo de re-compilación de bloat. –

+4

¿Qué tal una actualización de hardware? –

Respuesta

3

No estoy al tanto de cualquier herramienta para la mejora del tiempo de compilación, pero algunos remedios manuales, puedo sugerir (considerar esto como comentario):

  1. #include Tiene guardias con cada archivo de cabecera, de modo que múltiples inclusiones no harán ningún problema
  2. Reducir cuerpo de la función miembro, el cuerpo función en línea poner directamente en los archivos de cabecera; solo tienen sus declaraciones
  3. Compruebe si no hay ninguna función y clases innecesarias template; recuerde que los tempaltes se convierten en inline de forma predeterminada. Demasiadas plantillas/metaprogramación de provocan un gran tiempo de compilación.
  4. Si son innecesariamente elevado número de #define s entonces habría etapa de pre-procesamiento incremento, que en última instancia, aumenta el tiempo de compilación
5

un enfoque me gusta es revisar la salida del preprocesador de algunas de sus fuentes - acabo de leer algo de él desde la perspectiva del compilador en lugar de la representación algo abstraída que es #inclu sion. es probable que encuentre algunos fragmentos grandes de inclusiones/bibliotecas que no necesita y que no necesariamente estaban al tanto de la existencia (o necesidad) de la dependencia/inclusión. a partir de ahí, decida qué dependencias se pueden eliminar. incluso si sus dependencias fueran todas correctas, las salidas grandes también pueden sugerir cómo puede acercarse a dividiendo módulos más grandes en piezas más pequeñas.

4

C++ no siendo modular (aún), los cuellos de botella de compilación a menudo incluyen problemas; eso es usando incluir demasiados archivos cuando no son necesarios. También es posible que esos incluidos sean necesarios en el momento, pero podrían volverse superfluos con una reingeniería simple.

  • para detectar incluye superfluo, se puede comprobar include-what-you-use, el único problema que tendrá es que funciona en la parte superior de Sonido metálico, por lo que tendrá algún tipo de configuración allí.
  • de lo contrario, debe revisar su código y, específicamente, los encabezados .

Como la herramienta es autosuficiente y está documentada, permítanme ampliar un poco el proceso de revisión.

  1. Cualquier encabezado que tenga más de un par #include es muy sospechoso.
  2. Por el contrario, si tiene un archivo fuente repleto de varios tipos y funciones y solo tiene un par incluye, probablemente signifique que uno de los encabezados trae demasiado.

Si tiene problemas para saber qué se requiere, qué no, y cómo quitar los encabezados superfluos, recomiendo una lectura de Pimpls - Beauty Marks You Can Depend On; si no sabes qué es un Pimpl, lee Compilation Firewalls. Sin embargo, aconsejaría cautela, Pimpl tiene un costo de tiempo de ejecución y mantenimiento, así que solo úselo cuando sea realmente necesario. Personalmente, lo recomendaría absolutamente en los encabezados públicos de una biblioteca que entregue a terceros (compatibilidad ABI), y de lo contrario trataré de evitarlo.

Si la inspección manual no es su fuerte, puede generar la salida del preprocesador para cada encabezado (no se preocupe demasiado por los archivos fuente) y compruebe los resultados más grandes.

1

Usted puede mirar en unity builds.
Básicamente se trata de que incluye todos los archivos .cpp en un archivo .cpp y sólo la compilación que un archivo. Lo probé en un gran proyecto y fue realmente efectivo.
Funciona porque usa mucho menos E/S cuando incluye todos sus encabezados/cpp una vez y no por cada cpp.

Ahora ya no usamos builds unificadas porque todos obtuvimos una actualización de hardware SSD, y son simplemente increíbles.

Aquí hay una cuestión de forma relacionada acerca de la unidad se basa: #include all .cpp files into a single compilation unit?

No
+0

+1 - comentario muy interesante sobre Unity Builds - Tendré que intentarlo la próxima vez que toque un encabezado de bajo nivel. En cuanto a los discos SSD, llegué tarde al juego: simplemente lo agregué a una computadora portátil después de un bloqueo del HDD: el aumento de la velocidad sugirió que debería cambiar el cuadro de compilación a SSD. Después de su comentario, definitivamente haré el cambio, una vez que la capacidad sea un poco más alta/el precio sea un poco más barato. – kfmfe04

Cuestiones relacionadas