2011-01-20 12 views
6

Tengo un dpr con más de 290 unidades.Proyecto Delphi con muchas unidades requiere mucho para ejecutar

El exe compilado es de 50MB.

código de la DPR es ahora así:

begin 
    ShowMessage('Before Initialize'); 
    Application.Initialize; 

Cuando hago doble clic en el archivo EXE construido Me he dado cuenta de que pasen 8 segundos antes de ver "Antes de inicialización". ¿Esto es debido a un gran tamaño de exe? ¿O hay una manera de minimizar este tiempo?

Respuesta

4

Según su pregunta, puede ser cualquier cosa.

El único consejo que puedo dar es medir:
registrar los sellos de tiempo de cada entrada/salida en todas sus secciones de inicialización de la unidad.

Basado en uno de sus comentarios (que se debe añadir a su pregunta, ya que describe con más detalle):

WindowsCodecs.dll es inicializado por una de sus unidades, probablemente, la conversión de una o más imágenes de un formato a otro.
Debe retrasar la conversión hasta que se necesite el resultado de esa conversión.

--jeroen

+0

¿Cómo puedo verificar qué línea de código hace que se llame a WindowsCodec.dll? – LaBracca

+1

Eso puede ser difícil; lo que podría hacer es en la ventana de Delphi Modules, establecer un punto de interrupción en la carga de WindowsCodec.dll y luego observar la pila durante el punto de interrupción. –

+5

Finalmente descargué la prueba de AQTime Profiler y encontré que el problema estaba en un código de inicialización de biblioteca de terceros. – LaBracca

17

Antes de la aplicación.Inicializar cada sección de inicialización de cada unidad se ejecuta. Es posible que tenga algún código que lleve tiempo.

El número de unidades no es el problema. Tengo un proyecto con más de 1100 unidades, exe es de 35 MB y se inicia instantáneamente.

Si está comenzando desde una unidad de red o un disco realmente lento, es posible que experimente una desaceleración.

+4

Usted puede ser capaz de diagnosticar donde el programa está gastando su tiempo pegando un perfilador (por ejemplo http://delphitools.info/samplingprofiler/) en él durante el arranque. –

+4

También podría ser causado por un programa antivirus. – gabr

+5

Sugerencia rápida: como se indicó anteriormente, se ejecutan las secciones de inicialización en su aplicación, pero también se ejecutan las secciones de inicialización para sus componentes. Una gran ralentización que encontré en el inicio (hasta 60 segundos de retraso) se debió a un componente de diálogo de propiedades de la impresora que intentaba consultar las propiedades de una impresora de red que había instalado en el panel de control, que no respondía. Las unidades de red mapeadas y otros recursos de red que no responden, y las inicializaciones de componentes pueden ser un área problemática. Use AQTime, que viene con RAD Studio XE, para perfilar su aplicación. –

1

La sección de inicialización de las unidades normalmente no es un problema de velocidad (a menos que tenga algunas cosas relacionadas con la base de datos allí).

Lo que podría ser lento es la carga de TForm desde los recursos.

Siempre es mejor tener el TForm creado sobre la marcha, solo cuando es necesario: - Vaya al menú "Proyecto", luego seleccione "Opciones", luego la pestaña "Formularios". - Coloque todos los formularios no obligatorios de la lista de la izquierda a la lista "disponible" de la derecha. - Crea los formularios bajo petición, por algún código.

La unidad sigue siendo el mismo:

type 
    TOneForm = class(TForm) 
    .... 
    end; 

var 
    OneForm: TOneForm; 

pero se puede utilizar el siguiente código para crear el formulario de solicitud:

En lugar de su ex

OneForm.ShowModal; 

utiliza este tipo de código

if OneForm=nil then 
    OneForm := TOneForm.Create(Application); 
    OneForm.ShowModal; 

Encontrarás la carga de la aplicación mucho más rápido.

Nota: Acabo de leer que el problema estaba antes de la carga del formulario. Así que el truco anterior no funcionará para este problema en particular. Guardo la respuesta porque podría ser útil para otros. Leeré mejor la próxima vez. :(

En todos los casos, tener una gran cantidad de código se ejecute desde la inicialización no es un buen diseño. Suena como un montón de objetos o variables globales ... refactorización podría tener sentido aquí ... :)

+0

sí, mi problema es incluso antes de APplication.Initiazlize. – LaBracca

1

Ya sabe que si tiene muchos formularios, intente mover los formularios fuera de la lista "auto create" y luego agregue el código para crear los formularios cuando los necesite, pero está viendo este problema antes que usted incluso podría crear una forma. Entonces, como han dicho otros, las secciones de inicialización son el problema.

el blog de Jeroen me señaló a un gran recurso para la depuración de esto:

http://wiert.wordpress.com/2010/07/21/delphi-great-post-by-malcolm-groves-about-debugging-initialization-and-finalization-sections/

Me señaló a Malcom Groves:

http://www.malcolmgroves.com/blog/?p=649

+1

Tarda 8 segundos antes de que se forme la etapa de creación automática. –

+0

Sí, solo tengo 2 auto crear módulos de datos, pero en cualquier caso ese código no se ejecuta, mi problema es antes de la aplicación. Inicializar. – LaBracca

1

Hay un montón de buenas sugerencias en this question .

Debe asegurarse de no crear nada en el inicio que no necesita de inmediato. Este suele ser el mayor retraso de lanzamiento en proyectos con muchas formas.

En su caso, parece que se está ejecutando una gran cantidad de código de inicialización.

Cuestiones relacionadas