2010-04-29 11 views
27

En un proyecto nativo de C++, la vinculación en este momento puede tomar uno o dos minutos. Sin embargo, durante este tiempo, la CPU cae del 100% durante la compilación a prácticamente cero. ¿Significa esto que vincular es principalmente una actividad de disco?¿Por qué el enlace C++ no usa prácticamente ninguna CPU?

Si es así, ¿es ésta la principal zona de un SSD haría grandes cambios? Pero, ¿por qué no se guardan todos mis archivos OBJ (o tantos como sea posible) en la memoria RAM después de la compilación para evitar esto? Con 4   GB de RAM, debería poder guardar un montón de acceso al disco y volver a conectarlo a la CPU, ¿no?

Actualización: por lo que es obvio es el seguimiento, puede el compilador y el enlazador charla VC++ mejor juntos para simplificar las cosas y mantener los archivos OBJ en la memoria, similar a cómo lo hace Delphi?

+0

I _speculate_ queda en el sistema operativo guardarlos en la memoria RAM para evitar esto, lo que hace, si hay suficiente RAM para hacerlo además de la compilación. Como la compilación requiere mucha memoria RAM, es probable que esto provoque que el sistema operativo limpie los archivos OBJ en el disco. Si lo fuerza a mantener los archivos OBJ en la memoria para hacer enlaces más rápidos, por lo tanto _probablemente_ haría la compilación mucho más lenta aún. –

Respuesta

6

En las compilaciones de depuración en Visual Studio puede usar incremental linking, que le permite evitar mucho tiempo de enlace. Básicamente significa que, en lugar de vincular todo el archivo EXE (o DLL) desde cero, se basa en el que enlazó por última vez, reemplazando solo las cosas que cambiaron.

Sin embargo, esto no se recomienda para compilaciones de versiones liberadas, ya que agrega un poco de sobrecarga en tiempo de ejecución y puede dar como resultado un archivo EXE que es varias veces más grande que el habitual.

+2

Lo sentimos, no aborda la pregunta. –

+0

Soluciona el problema de hacer un "gran cambio" en la vinculación del rendimiento. – shoosh

+0

¿eh? preguntó si una ssd aceleraría la vinculación si estuviera vinculada. –

12

La vinculación es de hecho principalmente una actividad basada en disco. Borland Pascal (de vuelta en el día) mantendría todo el programa en la memoria, por lo que se vincularía tan rápido.

Sus archivos OBJ no se guardan en la RAM porque el compilador y el enlazador son programas separados. Si su entorno de desarrollo tenía un compilador y un enlazador integrados (en lugar de ejecutarlos como procesos separados), de hecho podría mantener todo en la memoria RAM.

Pero perdería la capacidad de separar el entorno de desarrollo de los compiladores y/o vinculadores; tendría que usar el mismo compilador/vinculador, y no podría ejecutar el compilador fuera del entorno.

+1

Delphi todavía lo hace. – dthorpe

+0

Pensé que sí, pero con las diversas encarnaciones de Delphi, no estaba seguro si todavía lo hacía. –

+4

Si está ejecutando cualquier sistema operativo razonable, la información ya estará almacenada en la memoria caché, lo que reduce la necesidad de tener todo el conjunto de objetos en la memoria para vincular. –

7

Puede intentar instalar algunas de esas utilidades de discos RAM y mantener su directorio obj en el disco RAM o incluso en el directorio completo del proyecto. Eso debería acelerarlo considerablemente.

No se olvide de hacerlo permanente después :-D

+0

vale la pena ir ... Creo que puede establecer archivos intermedios para ir a un lugar separado, por lo que no tendría que ser permanente, excepto que si van los archivos ONJ, tendría que hacer compilaciones completas todo el tiempo. No estoy seguro de si vale la pena la molestia, depende de lo útil que pueda ser un disco RAM para automatizar todo esto –

3

Es difícil decir exactamente lo que está tomando el enlazador tanto tiempo sin saber cómo está interactuando con el sistema operativo. Afortunadamente, Microsoft proporciona Process Monitor para que pueda hacer precisamente eso.

Me ha ayudado a diagnosticar errores con el Visual Studio IDE y el depurador sin acceso a la fuente.

6

El Estudio Visual enlazador es en gran medida de E/S de la envolvente, pero ¿es así depende de algunas variables.

  1. vinculación incremental (común en versiones de depuración) generalmente requiere mucho menos I/O.

  2. Escribir un archivo PDB (para símbolos) puede consumir una gran cantidad de tiempo. Es un cuello de botella específico al que apunta Microsoft en 2010. La escritura PDB ahora se hace de forma asíncrona. No lo he intentado, pero he oído que puede ayudar a los tiempos de enlace bastante.

  3. Si utiliza la generación de código de tiempo de enlace (LTCG) (común en versiones de versión), tiene inicialmente todas las E/S habituales. Luego, el enlazador vuelve a invocar el compilador para volver a generar el código de las secciones que se pueden optimizar aún más. Esta porción generalmente requiere mucho más CPU. De la mano, no sé si el enlazador realmente hace girar el compilador en un proceso separado y espera (en cuyo caso todavía verás un bajo uso de la CPU para el proceso del enlazador), o si la compilación se realiza en el proceso del enlazador (en cuyo caso verá que el enlazador atraviesa fases de E/S pesada y CPU pesada).

El uso de un SSD puede ayudar con las porciones de E/S encuadernadas. Simplemente tener un segundo disco puede ayudar, también. Por ejemplo, si su fuente y objetos están todos en una unidad, y usted escribe su PDB en una unidad separada, el enlazador debería pasar menos tiempo esperando la escritura PDB. Tener un segundo disco giratorio ha ayudado mucho a los tiempos de enlace de mi equipo actual.

+0

+1. Pasar del plato giratorio al SSD puede marcar una diferencia increíble con la velocidad de la mayoría de los procesos de construcción. El impulso de la velocidad generalmente debe verse para creerse :-). –

Cuestiones relacionadas