2009-05-28 33 views
29

Estoy trabajando en un gran proyecto delphi 6 con bastantes dependencias. Lleva varios minutos compilar todo el proyecto. La recompilación después de unos pocos cambios a veces es mucho más larga para que sea más rápido terminar Delphi, borrar todos los archivos dcu y volver a compilar todo.Delphi: ¿Cómo organizar el código fuente para aumentar el rendimiento del compilador?

¿Alguien sabe una manera de identificar, qué hace que el compilador sea más lento y más lento? ¿Algún consejo sobre cómo organizar el código para mejorar el rendimiento del compilador?

ya he probado siguientes cosas:

  • explícitamente incluyen la mayoría de las unidades en el DPR lugar de depender de la ruta de búsqueda: No mejoró nada.
  • Usa el compilador de línea de comandos dcc32: no es más rápido.
  • Intenta ver lo que hace el compilador (usando ProcessExplorer desde SysInternals): aparentemente ejecuta la mayor parte del tiempo una función llamada 'KibitzGetOverloads'. Pero no puedo hacer nada con esta información ...

EDITAR, Resumen de las respuestas hasta ahora:

La respuesta que mejor funcionó en mi caso:

  • El función "Limpiar referencias de unidades no utilizadas" de cnpack. Limpió casi automáticamente más de 1000 referencias, haciendo una compilación "fría" aproximadamente dos veces más rápida. (compilación "fría" = borrar todos los archivos dcu antes de compilar). Obtiene la lista de referencia del compilador. Entonces, si tiene un {$ IFDEF}, verifique que todas sus configuraciones aún se compilan.

La siguiente cosa que le gustaría probar:

  • Refactorizando las referencias de unidades manualmente (con el tiempo utilizando una clase abstracta) pero es mucho más trabajo, ya que primero se debe identificar en el que el los problemas son Algunas herramientas que pueden ayudar:
    • GExperts añade un navegador dependencias del proyecto para el IDE de Delphi (pero por desgracia, no se puede mostrar el tamaño de cada rama)
    • Delphi Unit Dependency Viewer V1.0 hacer de lo mismo pero sin Delphi. Puede calcular algunas estadísticas simples (¿Qué unidades es la más referenciada, ...)
    • Icarus que se hace referencia en a link en una de las respuestas.

cosas que no cambiaron nada en mi caso:

  • Poner todos los archivos de mi programa y todos los componentes en una carpeta sin subcarpetas.
  • Desfragmentando el disco (probé con un ramdisk)
  • Usando un ramdisk para el código fuente y las carpetas de salida.
  • Apagar el antivirus de detección en vivo
  • Enumerar todas las unidades en el archivo dpr en lugar de confiar en la ruta de búsqueda.
  • Usando el compilador de línea de comandos dcc32 o ecc32.

cosas que no se aplican a mi caso:

  • evitando tener dependencias de recursos compartidos de red.
  • Usando DelphiSpeedUp, porque ya lo tenía.
  • El uso de una sola carpeta para todos los DCU (siempre lo hago)

cosas que no lo probé:

  • La actualización a otra versión de Delphi.
  • Usando dcc32speed.exe
  • Utilizando una unidad de estado sólido (no lo probé, pero probé con un ramdisk donde puse todo el código fuente. Pero tal vez debería haber instalado Delphi también en el ramdisk)
+1

Acerca de su problema de $ IFDEF, debe adjuntar las unidades utilizadas con el propio $ IFDEF para aliviar el problema de CnPack eliminándolas por no ser utilizadas. –

+0

@Lieven: buena idea para encerrar a toda la unidad con el $ IFDEf adecuado. Pero no siempre es posible: si la unidad es parte de una biblioteca que no desea cambiar, está obligado a poner $ IFDEF en los "Usos". – Name

Respuesta

9

Algunas cosas que podrían ralentizar el compilador

  • unidades redundantes en su cláusula uses. Vea this question para un enlace a CnPack.
  • No agrega unidades explícitamente a su archivo de proyecto. Ya parece haber cubierto eso.
  • Cambió la configuración del compilador, más notablemente include TDD32 info.

Trate de deshacerse de las unidades no utilizadas en su cláusula de uso y vea si hace una diferencia.

+1

Gracias por su respuesta. cnpack parece interesante. Voy a intentarlo. Incluir TDD32 ya está desactivado. BTW también hay un compilador llamado ecc32 (que llama a dcc32), no sé la diferencia exacta. – Name

+1

@Name, no lo sabía, lo siento por la edición. Ahora que lo menciona, también hay dcc32speed.exe. Está escrito por Andreas Hausladen y parchea varias funciones para acelerar el compilador. –

+1

La función "Limpiar referencias de unidades no utilizadas" de cnpack fue una muy buena respuesta. Limpió casi automáticamente más de 1000 referencias, por lo que una compilación "fría" fue aproximadamente dos veces más rápida. – Name

7

Compruebe si hay rutas en las rutas de búsqueda que no están en su máquina local.

es decir, no se vinculan a archivos binarios en recursos compartidos de red y se comprueba que la ruta de búsqueda no esté controlando ningún recurso compartido de red.

+0

No hay nada compartido en la red. Pero un buen consejo de todos modos. – Name

4

No he visto el compilador obtener más lenta con el tiempo, pero ha sido un largo tiempo ya que utilizamos Delphi 6.

  1. Parece ser que el acuerdo general en la comunidad de Delphi que, si no No quiero actualizar a lo último y mejor (Delphi 2007 o 2009), luego Delphi 7 es el mejor/más rápido/más estable. Puede considerar actualizar.
  2. KibitzGetOverloads suena como algo del compilador de kibitz - el compilador de "fondo" que le proporciona completar el código, resaltar el error de fondo, información sobre herramientas de código, etc. Suena como si fuera mejor consultar la pila de llamadas del comando- compilador de línea, no el IDE; obtendrías algo más útil.
  3. Nunca he encontrado que las compilaciones sean más rápidas después de eliminar las DCU. Las DCU están ahí para hacer que la construcción sea incremental, por lo tanto, más rápida. Si ve compilaciones más rápidas después de eliminar todas las DCU, verifique su hardware. ¿Has desfragmentado tu disco duro últimamente? ¿Cuánto espacio libre tienes en el disco?
+0

Lo mismo para el compilador de la línea de comandos, aparentemente pasa mucho tiempo en KibitzGetOverloads. El espacio en disco no es un problema de desfragmentación, probablemente no ayude, ya que obtengo el mismo resultado cuando coloco todo el código fuente en un ramdisk. Actualizar a un Delphi más nuevo podría ser una opción, pero preferiría averiguar qué hace que Delphi sea más lento. – Name

3

Aunque sólo en parte relevante a su pregunta exacta, oigo que el uso de una unidad de estado sólido está aumentando enormemente el tiempo de compilación con Delphi - Nick Hodges dijo que esto mismo en el Delphi Podcast hace un par de semanas. Brian

+0

Interesante idea, que me dio otra idea: traté de poner todo el código fuente en un ramdisk. Pero no obtuve ninguna mejora. Windows probablemente almacena en caché los archivos lo suficientemente bueno. – Name

5

Puede probar DelphiSpeedUp y ver si hace una diferencia. No acelerará la compilación de línea de comandos, pero afirma tener algunas aceleraciones para la compilación de IDE.

+0

Ya tengo DelphiSpeedUp. Gracias por el consejo de todos modos. – Name

9

usando Delphi 7 y 2009, la semana pasada paso de casi 2 minutos para la compilación y otros 45 segundos de presionar f9 y obtengo la forma principal de mi aplicación de 20 segundos de compilación y ejecución. Esto me ha vuelto loco durante unos 6 meses y nada de lo que intento parece funcionar. Usando filemon de SysInternals, me doy cuenta de que cada unidad (en su mayoría componentes) que el compilador requiere se buscó en cada carpeta que estaba en la ruta de búsqueda, sí, esto produce MUCHAS FileOpen, FileExists y FileNotFound, etc. Lo que hago fue poner cada DCU, DFM, RES, etc. de componentes, todos en una sola carpeta, y teniendo solo esta carpeta en la ruta de búsqueda, y un par de otras carpetas requeridas por el proyecto; los resultados fueron increíbles Otro problema antes de la corrección, fue la depuración. Se tarda casi 40 segundos en cada pulsación de tecla F7, F8 durante la depuración, esto también se ha solucionado. Espero que esta información pueda ayudarte. Saludos desde Isla de Margarita, Venezuela. Disculpe mi inglés, si hay algún error;)

+0

No es muy práctico, pero podría valer la pena intentarlo. – Name

+0

Lo probé, no cambió nada en mi caso. – Name

3
  1. ¿Ha establecido una sola carpeta para obtener las DCU. Si no, se dispersarán por todas partes.
  2. Coloque todas las unidades y sus unidades llamadas implícitamente (excepto los componentes instalados de la ruta de la Biblioteca) en el dpr. Para asegurarse de que no se le escapó algo, vacíe su ruta de búsqueda, todavía debe compilarse.
  3. Después de reducir la ruta de búsqueda, puede intentar reducir la ruta de la biblioteca instalando los componentes en menos carpetas.
+0

Hago el número 1 sistemáticamente, pero podría ser un buen consejo para las personas que no lo hacen. Ya probé el número 2 como ya dije en mi publicación original. No sé si el número 3 ayudaría, pero sería mucho trabajo solicitarlo, por lo que sería la última oportunidad que podría probar. – Name

1

Intente instalar un disco RAM y configure su ruta de salida dcu para apuntar allí. Esto más que redujo a la mitad mi tiempo de compilación con Delphi 2007 en la parte superior de DelphiSpeedUp.

+0

Ya lo he intentado después de que Brian Frost dijera que la unidad de estado sólido parece aumentar el rendimiento. En mi caso, no cambió nada.Puede ser que Windows ya hace un buen trabajo al almacenar en caché los archivos. – Name

2
+0

No sabría dónde dividir el código fuente en el lugar correcto para mejorar el tiempo de compilación en la mayoría de los casos porque no sé qué hace que el compilador sea más lento. Entonces podría durar mucho hasta que realmente obtenga buenos resultados. +1 por el consejo sobre el antivirus. No pensé en eso hasta ahora, vale la pena intentarlo. – Name

+1

El tercer punto se puede aliviar si el AV permite excepciones de ruta, por lo que puede enumerar allí \ Lib; \ dcu; etc. Así que no será difícil los tiempos de compilación. Sé que avast! tener esta opción en la edición de inicio. No sé otros –

1

El compilador sólo compilará unidades que han cambiado. Si ha cambiado el código en la sección de interfaz, todas las unidades que dependen de la unidad modificada se compilan. Si solo se modifica el código en la sección de implementación, la compilación solo incluirá esa unidad pero, presumiblemente, vinculará todos los módulos. Implica un buen diseño de interfaces por adelantado, pero si reestructura el código para restringir los cambios en la implementación, los tiempos de compilación podrían reducirse. No tengo idea de cuánto. Este hecho se menciona en los archivos de ayuda de Delphi en Referencias de unidades múltiples e indirectas en Delphi 7 "Using Delphi".

+0

Me gustaría refactorizar el código para mejorar la velocidad del compilador. Pero no sabría por dónde empezar. Sería bueno tener una herramienta que muestre qué dependencias causan problemas. Pero tal herramienta probablemente no existe. – Name

2

Tuvimos el mismo (o similar) problema. I de nuestro paquete tiene tiempo de compilación unos 12 min. Después de los cambios, ahora hemos movido a 32 sg.

Después de muchas pruebas encontramos que la "situación problemática" era el siguiente: en un solo paquete:

  • El Una unidad de utiliza un gran número de unidades: U1, U2, U3, U4, ... U100 (Usos de la interfaz) en el mismo paquete. Esta es una unidad importante que centraliza todo el trabajo de inicialización.

  • Todas las unidades del paquete, U1, U2, U3, .., U100 utiliza unidad de (uso de la aplicación)

Este "referencia circular" no da errores de compilación debido a que la Los USOS son diferentes, pero causaron un gran tiempo de compilación.

SOLUCIÓN: Eliminar la referencia a cada unidad, U1, U2, U3, ...., en el U100 Una Unidad.

Ahora, Una unidad utilizar un gran número de unidades: U1, U2, ...., U100, pero las unidades U1, U2, ..., U100, no utiliza la unidad A.

Después de este cambio, el tiempo de compilación se reduce drásticamente.

Si tiene una situación similar, puede intentarlo.

Disculpa por mi mal inglés.

Saludos.


Neftalí -Alemán Estévez-

+0

Interesante observación. Creo que tengo un caso así. Trataré de echarle un vistazo. – Name

+0

Vea también el enlace proporcionado por Fabricio Araujo, que va en la misma dirección: http://coding.derkeiler.com/Archive/Delphi/borland.public.delphi.non-technical/2006-05/msg00700.html – Name

3

Yo tenía el mismo problema y que puede llegar a (2) razones que me efectúa.

  1. Referencias circulares. El caballero que dijo que uno era correcto. Tendría ciertos proyectos GRANDES que compilarían rápido, y proyectos PEQUEÑOS que se compilaron lentamente. No pude resolverlo hasta que reestructuré el código y luego obtuve las velocidades de compilación más rápidas. Montones de unidades pequeñas Es fácil construir unidades monolíticas. Pero, hay muchas penalidades de eso.

  2. Lo he escuchado mil veces, desarrolle en una máquina lenta como sus usuarios podrían estar utilizando. Oye, eso es para el departamento de pruebas. No puedo perder el tiempo con la compilación, las velocidades de carga de Delphi, los paquetes, etc. Salí y compré una computadora "GAMERS" (WOW) con las unidades de estado sólido (como se mencionó anteriormente), 12GB de RAM, el chip Intel "i7" OVERCLOCKED , tarjetas de video triples (vinculadas), todas en Vista64 (Vista no está mal una vez que finalmente se ejecuta con todas las partes instaladas). Fue un verdadero dolor tenerlo todo listo. Pero, ya no estoy esperando en mi computadora. Velocidad de compilación pura, velocidad de carga, más una nueva máquina nueva sin toda la basura que se instaló en la última en los últimos 2 años. Incluso descargué DelphiSpeedUp. No lo necesité. Y no necesito apagar AntiVirus, ya que también hice eso, y me penalizaron con la basura de Internet. Entonces AntiVirus permanece encendido. Pura y simple, obtenga una máquina BALLS OUT. Su tiempo vale más de lo que gastará en una computadora nueva.

+0

Por qué detenerse en 12 GByte, ¿32 no sería mucho más BOLSAS HACIA FUERA? No en serio, ¿podría agregar algo de información sobre por qué alguien necesitaría esta ridícula y exagerada máquina para hacer * el desarrollo de Delphi *? – mghie

+0

Ha preguntado cómo aumentar la velocidad del compilador. ¿Desde cuando SLI/Crossfire/disco de estado sólido aumentan la velocidad de compilación Delphi? ¿Desde cuando Delphi requiere más de 2GB de RAM? –

+0

VM almacena en caché la memoria RAM disponible, por lo que los archivos de origen terminan almacenados en memoria caché en la memoria RAM si tiene muchos. Además, los discos de estado sólido tienen tiempos de acceso aleatorio más bajos, por lo que los archivos se encuentran y se leen más rápido. El disco es el cuello de botella durante la compilación, por lo que cualquier cosa que acelere el disco acelera los tiempos de compilación. –

2

Ver this.

he comprobado con un código base VCL.NET y trabajaron .... No sé si siguen siendo válidas para la D2009, pero ha trabajado en D2006.net

+0

Va en la misma dirección que la respuesta de Neftalí, pero con una mejora: la sugerencia con la clase abstracta para mejorar el rendimiento. Gracias por el complemento. – Name

0
  • No compile en unidades de red. El tiempo de búsqueda es dramáticamente peor.
  • Considere apuntando el DCU directorio ("unidad de producción" a una unidad RAM.
  • limitar el número de include/directorios de la unidad.
  • tratar de evitar referencias circulares de menor importancia que el compilador sigue aceptando, especialmente para unidades grandes (por ejemplo, generada unidades ORM para su OPF). podría causar grandes unidades para ser compilado dos veces. (no Delphi permite circulares mutuos de menor importancia, o es que un FPC única característica?)

nunca lo intentó, pero codificando todos los archivos con la ruta completa/relativa en .dpr central también podría ayudar (script para regenerar/actualizar?). (Mencionas eso arriba, pero ¿fue con la ruta xx en '\ path \ yyy' no tación?).

Otros tiros largos:

  • Uso Kylix (archivo/dir/S bajo Linux es dramáticamente mejor en mi experiencia (aunque eso es por experiencia FPC)). Tal vez necesitamos un kylix cruzado invertido :-)
  • Use una máquina de compilación separada (Windows) y modifique NTFS sobre el registro para que sea menos "seguro". (que no te importa, ya que todo es un sistema de revisión para empezar). Afaik estas opciones solo se pueden hacer globalmente para todos los sistemas de archivos, de ahí el sistema separado. Lanza un conjunto de banda o Raptor también.
  • Olvídese del estado sólido. Un agradable zumbido en la atmósfera, pero la alta tasa de escritura lo matará (tanto la vida como el rendimiento cuando esté más lleno y no pueda asignar de manera óptima), y necesita los caros Intel para superar dos HD de $ 75 en RAID.

P.s. Perdón por las referencias de FPC. Hago ambas cosas, y a veces ya no sé qué pertenece a qué.

+0

"circulares mutuas menores"? Como nunca me enteré, creo que es una función exclusiva de FPC. –

1

Como no acumulé 50 puntos de reputación, no puedo responder a mi publicación de BALLS OUT. Entonces, tengo que comenzar una nueva línea de pedido aquí. Compré la máquina para trabajar en archivos de Photoshop muy grandes, y también hago muchos modelos 3D en Inventor y 3DStudio MAX. Es por eso que compré la nueva máquina. PERO ... Definitivamente recibí un impulso tremendo en mi uso de Delphi debido a eso. Mi sueldo cuesta mucho más que los 2K adicionales que gasté en la nueva máquina, en comparación con la compra de algunos Dell básicos (lo cual puede estar bien para Delphi). Entonces cualquier IMPRESIÓN que pueda recibir es una BONIFICACIÓN. Si haces este trabajo todo el día, todos los días como yo lo hago, cualquier latencia que experimentes comienza a convertirse en un verdadero problema. Lo que hizo por mí con el uso de Photoshop, productos de Autodesk y DELPHI. Entonces lo diré nuevamente, una nueva máquina BALLS OUT, MEJORARÁ su rendimiento. El tipo pregunta qué puede hacer para mejorar el rendimiento de compilación. Entonces, di mi opinión.

P.S. Coloque a Delphi y su proyecto en una Unidad de estado sólido, y verá una GRAN mejora en la velocidad.

0

Lo que hago es siempre asegurarme de tener muy pocos directorios en la ruta de la biblioteca, y la mayoría de los componentes y el código estático. También me aseguro de que NO haya ningún código fuente disponible en la ruta de la biblioteca, solo .dcu/.res, etc. Solo browsepath tiene el código fuente y las circunstancias especiales se manejan a través de searchpath para el proyecto.

Limite lo que compila en cualquier situación.

0

Unos años más tarde estoy luchando de nuevo con el aumento de los tiempos de compilación. Actualmente estoy usando Delphi XE4 y estoy en un punto en el que necesito absolutamente refactorizar las referencias de unidades. Pensé en una nueva forma de identificar dónde están los problemas:

estoy usando Process Monitor from Microsoft/SysInternals para controlar el compilador:

  1. empiezo el monitor de procesos con un filtro para mostrar sólo DCC32.exe (o bds .exe cuando se trabaja desde el IDE).
  2. Construyo mi proyecto desde la línea de comandos.
  3. Al final veo las operaciones CreateFile en el registro de Process Monitor.

Para cada unidad, habrá una entrada para el archivo .PAS (cuando el compilador comienza a trabajar en esta unidad) y otro para el archivo .DCU (cuando el compilador ha terminado de forma compleja con esta unidad). Al trabajar en el registro con un editor de texto y/o con Excel puedo extraer este tipo de información:

  • Una especie de “árbol”, donde se ve de forma recursiva el orden en que las unidades han sido compilados.
  • Para cada unidad, la demora entre ".PAS file opened" y ".DCU file written".

Luego trato de interpretar los resultados para encontrar lugares donde hacer algunas refactorizaciones aceleraría el tiempo de compilación. No es tan fácil, pero estoy obteniendo algunos resultados alentadores.

Cuestiones relacionadas