help gcc pipe compiler-options

gcc - help - ¿Cuándo debería usar la opción GCP''s-pipe?



gcc flags list (6)

Por lo general, no hace ninguna diferencia

Tiene + y - consideraciones. Históricamente, ejecutar el compilador y el ensamblador al mismo tiempo enfatizaría los recursos de RAM.

Gcc es pequeño para los estándares actuales y -pipe agrega un poco de ejecución paralela accesible de múltiples núcleos.

Pero por la misma razón, la CPU es tan rápida que puede crear ese archivo temporal y volver a leerlo sin que usted lo note. Y como " -pipe nunca fue el modo predeterminado, de vez en cuando actúa un poco. Un desarrollador único generalmente informará sin notar la diferencia horaria.

Ahora, hay algunos proyectos grandes por ahí. Puedes ver un solo árbol que construirá todo Firefox, o NetBSD, o algo así, algo que es realmente grande. Algo que incluye todo X, por ejemplo, como un componente de subsistema menor. Puede notar o no una diferencia cuando el trabajo involucra millones de líneas de código en miles y miles de archivos C. Como estoy seguro que sabes, la gente normalmente solo trabaja en una pequeña parte de algo como esto a la vez. Pero si eres un ingeniero de lanzamiento o estás trabajando en un servidor de compilación, o si estás cambiando algo en stdio.h, es posible que desees construir todo el sistema para ver si has roto algo. Y ahora, cada caída de rendimiento probablemente cuente ...

La documentación de GCC 4.1.2 tiene esto que decir sobre la opción -pipe :

-tubo

Utilice tubos en lugar de archivos temporales para la comunicación entre las diversas etapas de la compilación. Esto no funciona en algunos sistemas donde el ensamblador no puede leer desde una tubería; pero el ensamblador GNU no tiene problemas.

Supongo que podría ver por el mensaje de error si los ensambladores de mi sistema no admitían las tuberías, entonces, además de ese problema, ¿cuándo importa si uso esa opción? ¿Qué factores deberían tomar la decisión de usarlo?


Desde el punto de vista del hardware, supongo que usaría -pipe para preservar la vida útil de su disco duro.


En nuestra experiencia con un proyecto de tamaño mediano, agregar- -pipe no hizo una diferencia perceptible en los tiempos de construcción. Nos encontramos con un par de problemas (a veces no se eliminan los archivos intermedios si se encontró un error, IIRC), y como no nos estaba ganando nada, dejamos de usarlo en lugar de intentar solucionar esos problemas.


Honestamente, hay muy pocas razones para no usarlo. -pipe solo usará un poco más de RAM, que si esta caja es código de construcción, supongo que tiene una cantidad decente. Puede mejorar significativamente el tiempo de compilación si su sistema está utilizando un sistema de archivos más conservador que escribe y luego elimina todos los archivos temporales en el camino (ext3, por ejemplo).


Probando esto ahora, parece ser moderadamente más rápido de construir cuando los destinos de fuente / construcción están en NFS (red de Linux). Sin embargo, el uso de memoria es alto. Si nunca llenas la RAM y tienes una fuente en NFS, parece una ganancia con -pipe.


Una ventaja es que con -pipe el compilador interactuará menos con un sistema de archivos. Incluso cuando se trata de un disco RAM, los datos aún necesitan pasar por las capas de E / S de bloque y de sistema de archivos cuando se utilizan archivos temporales, mientras que con un conducto se vuelve un poco más directo.

Con los archivos, el compilador primero debe terminar de escribir antes de poder llamar al ensamblador. Otra ventaja de las tuberías es que tanto el compilador como el ensamblador pueden ejecutarse al mismo tiempo y está haciendo un uso un poco mayor de las arquitecturas SMP. Especialmente cuando el compilador necesita esperar los datos del archivo fuente (debido al bloqueo de las llamadas de E / S), el sistema operativo puede dar al ensamblador tiempo completo de CPU y dejar que haga su trabajo más rápido.