tecnicas programa para optimizar optimizado optimizacion niveles modularidad generador conversion codigo c++ visual-c++

c++ - programa - ¿Cuáles son los pros y los contras de la generación de código de tiempo de enlace?(VS 2005)



programa para optimizar codigo (5)

Es difícil de decir, porque eso depende principalmente de su proyecto y, por supuesto, de la calidad del LTCG proporcionado por VS2005 (que no tengo suficiente experiencia para juzgar). Al final, tendrás que medir.

Sin embargo, me pregunto por qué tienes tantos problemas con la duración extra de la versión de lanzamiento. Solo debe distribuir binarios reproducibles, estables y versionados que tengan fuentes reproducibles o archivadas. Rara vez he visto una razón para las compilaciones de versiones incrementales frecuentes.

La configuración recomendada para un equipo es la siguiente: los desarrolladores generalmente crean solo compilaciones de depuración incrementales en sus máquinas. La creación de un lanzamiento debe ser una compilación completa desde el control de origen hasta redistribuible (binarios o incluso configuración), con un nuevo número de versión y etiquetado / archivo de las fuentes. Solo estos deben ser dados a probadores / clientes internos.

Idealmente, moverías la compilación completa a una máquina separada, o tal vez a una máquina virtual en una buena PC. Esto le proporciona un entorno estable para sus compilaciones (incluye bibliotecas de terceros, variables de entorno, etc.).

Idealmente, estas compilaciones deberían ser automáticas ("un clic desde el control de origen hasta la configuración") y deberían ejecutarse diariamente.

He oído que habilitar la generación de código de tiempo de enlace (el modificador / LTCG) puede ser una gran optimización para proyectos grandes con muchas bibliotecas para vincular. Mi equipo lo está usando en la configuración de lanzamiento de nuestra solución, pero el largo tiempo de compilación es una verdadera carga. Un cambio en un archivo que no depende de otro archivo desencadena otros 45 segundos de "Generación de código ...". La liberación es ciertamente mucho más rápida que la depuración, pero podríamos lograr la misma aceleración al desactivar LTCG y simplemente dejar / O2 activado.

¿Vale la pena irse / LTCG habilitado?


Sé que los chicos de Bungie lo usaron para Halo3, la única estafa que mencionaron fue que a veces arruinaba sus datos de reproducción deterministas.

¿Ha perfilado su código y determinado la necesidad de esto? En realidad, ejecutamos nuestros servidores casi por completo en modo de depuración, pero en casos especiales, algunos archivos que se perfilaron como críticos para el rendimiento. Eso funcionó muy bien, y ha mantenido las cosas depuradas cuando hay problemas.

No estoy seguro de qué tipo de aplicación está haciendo, pero dividir las estructuras de datos para que se correspondan con la forma en que se procesaron en el código (para una mejor coherencia del caché) fue mucho más grande para nosotros.


Tampoco veo problemas con el tiempo de compilación adicional mediante la generación de código de tiempo de enlace con la compilación de lanzamiento. Solo construyo mi versión de lanzamiento una vez por día (durante la noche) y uso las compilaciones de prueba unitaria y de depuración durante el día.


Descubrí que las desventajas son tiempos de compilación más largos y que los archivos .obj creados en ese modo (LTCG activado) pueden ser realmente masivos. Por ejemplo, los archivos .obj que podrían ser 200-500k tenían aproximadamente 2-3mb. Simplemente me pasó a mí que compilar un montón de proyectos en mi cadena me llevó a una carpeta de 2 gb, la mayor parte de los cuales eran archivos .obj.


Le permite al vinculador hacer la compilación real del código, y por lo tanto puede hacer más optimización, como en línea.

Si no usa LTCG, el compilador es el único componente en el proceso de compilación que puede alinear una función, como en el reemplazo de una "llamada" a una función con el contenido de la función, que suele ser mucho más rápido. El compilador solo lo haría de todos modos para las funciones donde esto produce una mejora.

Por lo tanto, solo puede hacerlo con funciones que tiene el cuerpo de. Esto significa que si una función en el archivo cpp llama a otra función que no está implementada en el mismo archivo cpp (o en un archivo de encabezado incluido), entonces no tiene el cuerpo real de la función y, por lo tanto, no puede alinearla .

Pero si usa LTCG, es el vinculador el que hace la línea de entrada, y tiene todas las funciones en todos los archivos cpp de todo el proyecto, menos los archivos lib referenciados que no fueron creados con LTCG. Esto le da al engarce (que se convierte en el compilador) mucho más para trabajar.

Pero también hace que su construcción tome más tiempo, especialmente cuando se realizan cambios incrementales. Es posible que desee activar LTCG en la configuración de lanzamiento de compilación.

Tenga en cuenta que LTCG no es lo mismo que la optimización guiada por perfil.