performance - ¿Por qué la velocidad de compilación de Delphi se degrada cuanto más tiempo está abierta y qué puedo hacer al respecto?
compilation (6)
Mi compañía ha estado ejecutando un gran proyecto en Delphi por más de una década. Nuestra base de código ha ido creciendo a lo largo de los años y ahora se sitúa en alrededor de 4 millones de líneas de código. La velocidad de compilación se está convirtiendo en un problema. Pasamos un tiempo eliminando las referencias circulares unitarias (una causa conocida de compilación lenta) y examinamos todos los aspectos de la configuración. Llega a un punto en el que no podemos mejorarlo aún más materialmente con lo que podemos controlar.
Por el momento, en una PC de última generación con 4 núcleos que ejecutan Windows XP SP3 y Delphi 2006, inicie Delphi en forma reciente y realice una compilación completa, demora ~ 40 segundos. Entonces, si hacemos otra construcción completa en la misma sesión Delphi inmediatamente, tomará 1m 40s. Haz otra construcción completa otra vez, empeorará. Y así sucesivamente.
(Sabemos que Windows almacena en caché los archivos y esto tiene un gran impacto en la velocidad de compilación. Las cifras anteriores se basan en que los archivos están en caché. Configuramos dicho escenario haciendo que Delphi compile el proyecto una vez, lo finalice y luego comenzando una nueva sesión de Delphi. Así que mientras que 40 segundos no parece ser lento, es solo porque los archivos están en la memoria caché de Windows. Y lo hacemos con el fin de tener una comparación de manzana a manzana).
Lo que nos desconcierta es por qué la velocidad de compilación empeora. (Hemos observado que en el pasado la desaceleración era peor si el proyecto tenía muchas referencias circulares unitarias). Si finalizamos Delphi y comenzamos una nueva sesión, el tiempo de compilación volverá a los 40 segundos. Una cosa aún más interesante que hemos observado es que podemos lograr la misma "mejora" de velocidad haciendo clic en el botón "Cancelar" para cancelar la compilación y luego hacer la compilación completa de inmediato. El tiempo de compilación volverá a 40 segundos también.
Nos parece que el propio caché de dependencia de unidad de Delphi no es tan eficiente como construirlo desde cero y está empeorando con el tiempo. Y también parece que el botón Cancelar borra de alguna manera este caché. Lo que estamos pensando es que, si podemos acceder al subsistema Delphi IDE que realiza este borrado, siempre podemos mantener la velocidad de compilación en su máximo rendimiento. Pero no sabemos cómo.
¿Alguien sabe lo que podemos hacer?
Todavía estamos usando Delphi 2006 ya que aún no hemos encontrado una forma factible de transferir nuestro gran proyecto a Unicode. Leí en los foros que el último Delphi XE presenta un problema de velocidad de compilación similar con la referencia circular unitaria. ¿Alguien sabe si Delphi XE ha solucionado el problema?
ps También sabemos que dividir el proyecto en paquetes de tiempo de ejecución puede reducir el tiempo de compilación. Pero por motivos de implementación y administrativos, tratamos de evitar el uso de paquetes de tiempo de ejecución.
¿Intentó compilar el código utilizando una línea de comando de scripts?
¿Recompilando desde la línea de comandos hizo que el proceso se mantuviera en 40 segundos?
ejecute desde cmd "dcc32.exe" para ver el uso.
Actualización: no puedo verificarlo ahora, sin embargo, debe intentar compilar desde la línea de comandos y ver si intenta ejecutar desde el ide, el ide no debe volver a compilarse, y le permite ejecutar con depuración.
Considere construir con paquetes de tiempo de ejecución internos, luego construya ejecutables monolíticos cuando envíe código a un departamento de control de calidad o distribuya su aplicación.
Esto requiere un mantenimiento adicional, pero los aumentos dramáticos en los tiempos de construcción valen la pena IMO.
Tenemos un proyecto 2.4 MLOC con aproximadamente 40-50 aplicaciones de soporte más pequeñas. Cuando se compila contra un grupo de paquetes de tiempo de ejecución, el proyecto se construye en aproximadamente 500K líneas y se construye aproximadamente 6 veces más rápido (15 segundos frente a 90 segundos). Muchas de las aplicaciones más pequeñas se compilan en un segundo o menos porque se comparte gran parte del código empaquetado.
Debe asegurarse de probar el ejecutable monolítico, no el ejecutable empaquetado. Pero en general no debería ver demasiadas diferencias de comportamiento si sigue buenas prácticas de codificación.
Esta question tiene más consejos para obtener una mejor velocidad de compilación. Evitar referencias circulares y detectar unidades no utilizadas (con CnWizards) son de mayor efecto.
La degradación gradual del rendimiento podría deberse a algún tipo de pérdida de memoria u otro error en el compilador. ¡Dios sabe que D2005 y D2006 tenían suficiente de ellos! Si no puede actualizar a una versión de Delphi habilitada para Unicode, debe al menos actualizar a D2007 (que creo que todavía está disponible desde Embarcadero) para una mejor estabilidad.
Además, como mencionó Robert Frank en un comentario, echa un vistazo a las herramientas de Andreas Hausladen. Hace solo unos días lanzó un parche que mejora bastante la velocidad de compilación. Desafortunadamente, esa característica específica es aparentemente solo para D2009 y posterior, pero muchas de sus correcciones ayudan a acelerar varias cosas, incluido el compilador.
Si construye su aplicación, aquí hay algunos trucos para acelerar el proceso:
- Borre todo * .dcu antes de la compilación (
del *.dcu /s
); - Ejecuta un buen desfragmentador en tu disco duro correspondiente;
- Coloque la mayoría de los archivos fuente en el mismo directorio e intente dejar las rutas IDE y de la biblioteca de proyectos lo más cortas posible, con las entradas más utilizadas al principio;
- Instala DelphiSpeedUp .
Delphi 2007 debería compilarse más rápido que Delphi 2006.
Delphi 2009/2010 / XE probablemente sea más lento: a partir del experimento del usuario, la implementación de genéricos y RTTI nuevos hizo que el proceso de compilación fuera más complejo, y se descubrió que la implementación real era más lenta, por ejemplo, que con Delphi 2007.
Actualizar:
¿Intentó habilitar la entrada del menú oculto de ProjectClearUnitCacheItem ?
Tengo esta entrada habilitada por CnPack, ya sea por DDevExtension (no sé cuál hará esto, probablemente más tarde). Esto podría usarse para borrar la memoria caché de la unidad interna.
Vale la pena probar DelphiSpeedUp de Andreas Hausladen, pero eso solo ayudará al rendimiento de IDE en lugar de a la compilación, tal como lo entiendo.
La otra idea que nadie ha sugerido todavía es usar discos de estado sólido de alta especificación.
Recomiendo usar Windows 7 de 64 bits con una gran cantidad de RAM para obtener el mejor rendimiento de almacenamiento en caché de archivos.
Agradece que tu proyecto no esté escrito en C ++.