2009-05-28 15 views
10

¿Hay alguna forma de optimizar el tiempo de enlace en MS Visual Studio C++ (2005)? Estamos utilizando Xoreax Incredibuild para acelerar la compilación, pero nada para el enlace.Cómo acelerar el tiempo de enlace C++

Actualmente, cada enlace tarda unos 30 segundos. Cuando enciendo la vinculación incremental, demora entre 35 y 40 segundos. (No importa si compilo el proyecto con o sin incredibuild)

¿Hay alguna manera, cómo perfilar el enlazador y ver cuánto tiempo lleva? ¿O alguna herramienta para enlaces paralelos? ¿O algún consejo para la optimización del código para acelerar el enlazador?

Gracias por la respuesta Ludek Vodicka


Editar:

Gracias por primeras respuestas, y la información adicional:

  • entero optimización del programa y la generación de código en tiempo de enlace es ya fuera .
  • idioma PIMPL ya se usa cuando es posible
  • otras bibliotecas estáticas ya están incluidas a través de #pragma comment (lib, "pathToLib"). (Mantenimiento también a causa de fácil]
  • HW: Quad Core Q6600, memoria RAM de 8 GB, 3x WD Raptor RAID 0. Windows Vista de 64 bits
+0

30 segundos no me parece mucho. Si realiza un desarrollo sensato, ¿con qué frecuencia ejecuta un ciclo de compilación/enlace? Tal vez cada 10-30 minutos si eres rápido. ¿Realmente importa si tienes que esperar 30 segundos allí? – lothar

+0

¿Cuánto dura la fase de compilación paralela? ¿Cuántos objetivos usualmente construyes a la vez? Si la fase de compilación toma 10 segundos y solo construyes un objetivo, no tengo mucha simpatía por tu situación. :) – bk1e

+0

Al desarrollar nuevas características, estamos compilando cada 10-20 minutos como usted dijo, pero al buscar y corregir errores, podría ser cada minuto ;-( La compilación del proyecto completo tarda unos 2 minutos y genera un objetivo. Al compilar solo un archivo cambiado, la compilación Fil tarda unos 3 segundos y enlaza aproximadamente 35 segundos ;-( –

Respuesta

8

No conozco ninguna herramienta de enlace paralelo; Sé que Incredibuild no lo permite.

La herramienta más grande en su caja de herramientas para evitar tiempos de enlace es el nivel adecuado de abstracción. Si los tiempos de enlace son largos, puede deberse a que los objetos saben demasiado sobre otros objetos. El desacoplamiento es la clave, a través de interfaces abstractas (quizás usando el paradigma PIMPL), o mediante otros métodos, como el paso de eventos.

La sobrecarga para vincular proyectos a través de Dependencias del proyecto también es bastante alta.Si su plataforma de destino es solo Win32, o principalmente, puede considerar usar un encabezado para vincular sus bibliotecas dependientes a través de #pragma comment (lib, "pathToLib").

+0

Configuración de un la dependencia a través de Project Properties | Linker | Input o mediante pragma comments es igual. Establecer una dependencia de proyecto no es automáticamente lin k en contra (creo que solía hacerlo en versiones anteriores), solo requiere la primera compilación antes que la segunda. –

7

Si se puede vivir sin la optimización, apague la generación de código en tiempo de enlace (elimine el modificador/GL o en las propiedades c/C++ -> Optimización -> Optimización de todo el programa. Para el vinculador, elimine/ltcg o utilice la Configuración de generación de código de tiempo de enlace). Esto hará que el compilador sea más lento, ya que ahora la generación de código ocurre Tiempo de compilación

He visto proyectos que tardan horas en compilarse con/GL +/LTCG, apenas unos segundos sin (este ejemplo: http://social.msdn.microsoft.com/Forums/en-US/vcgeneral/thread/750ed2b0-0d51-48a3-bd9a-e8f4b544ded8)

+0

Sí. Eso acelera el tiempo de vinculación, pero ralentiza el tiempo de compilación. –

1

¿Ha considerado mejorar el hardware?
¿Utiliza un disco duro físico separado para la compilación? ¿Qué tipo de unidades usas?

Como sugerencia general: eche un poco de memoria, obtenga Velociraptor, coloque solo fuentes y compile el directorio allí, mida de nuevo. Si eso ayuda, considere un RAID 0.

He escuchado informes de que la actualización de un núcleo de XP a un núcleo W2K3 mejoró notablemente los tiempos de construcción, presumiblemente debido a una mejor administración de la memoria y el almacenamiento en caché.

Como sugerencia para cambiar su código, podría mover algunas funcionalidades a una DLL, y vincularlas en paralelo. Pero no haría ese cambio solo para mejorar los tiempos de construcción.

0

Hay algunas sugerencias para los ajustes generales sobre Improving link time with IncrediBuild

También puede saltar vinculación de librerías estáticas donde no distribuirlos utilizando IncrediLink

Hemos encontrado que la adición de un paso posterior firma de construcción se detendría IncrediBuild de trabajar en proyectos siguientes, añadiendo un comentario a publicar acumulación se supone para ayudar a

rem IncrediBuild_AllowOverlap 

Ver IncrediBuild_AllowOverlap doc

Cuestiones relacionadas