2010-02-02 21 views
5

Recientemente, mi jefe me pidió que mejorara la velocidad de inicio de nuestra aplicación, la AP se escribió con C++. El AP es un poco grande, usó más de 200 dll, Windows necesita mucho tiempo para ingresar a la función main(). Intenté estas dos formas, pero todavía no puedo hacer feliz a nuestro jefe.formas de mejorar la velocidad de inicio de la aplicación C++

  1. carga de retardo DLL http://msdn.microsoft.com/en-us/library/yx9zd12s(VS.80).aspx
  2. uso EDITBIN a EXE para modificar http://msdn.microsoft.com/en-us/library/xd3shwhf(VS.80).aspx

¿Hay otras maneras de mejorarlo? Gracias por adelantado.

+2

La carga diferida no es mágica; también debe asegurarse de no usar esas DLL hasta mucho después del inicio. – MSalters

+2

Pidiendo lo obvio, pero ¿perfil de inicio? ¿Qué te dijo eso? – MSalters

Respuesta

5

Es necesario que el perfil de su aplicación a fin de determinar la verdadera causa de la desaceleración. Por ejemplo, es posible que pase la mayor parte del tiempo en una rutina de inicialización de una de las .dll que está cargando. Ve a buscar una buena herramienta de creación de perfiles y luego determina dónde está el cuello de botella.

+0

podría recomendar una herramienta para perfilar mi aplicación? Gracias. –

+0

Mi herramienta favorita es VTune. No es gratis, pero puede descargar una copia de evaluación de 30 días: http://software.intel.com/en-us/intel-vtune/ –

+1

El generador de perfiles no mostrará nada interesante, a menos que sabe cómo perfilar el disco duro. –

4

¡Por favor! ¡Reduce ese conteo de DLL!

Por supuesto, si vas a cargar 200 DLL en el arranque, incurrirá en montones de fallas de páginas duras, y tardará una eternidad en arrancar (como 3ds max).

Vuelva a pensar su estrategia de DLL. Combina muchas pequeñas DLL en las más grandes. Dudo seriamente que necesites más de 200.

Y mire Raymond Chen's Five Things Every Win32 Programmer Needs to Know.

0

Una de las opciones, y sus juegos de la mente pura, es proporcionar una barra de progreso de la carga ...

Si la gente tiene algo que ver que los distrae y lo hace "sentir" más rápido, por eso hay espejos entre ascensores que sirven a numerosas plantas ...

Esto no va a batir un cronómetro aunque ...

La otra alternativa es volver a escribir a utilizar menos DLL. ¿Cuánto de un presupuesto (dinero/tiempo) que se tiene es la siguiente pregunta

2

Un par de cosas que supongo que lo que necesita saber:

  • muchos archivos pequeños es mucho más lento que un par de grandes archivos
  • el acceso al disco es mucho más lento que el acceso a memoria (DLL necesitan ser cargados desde el disco)

reducir la cantidad de DLL es una necesidad en esta situación. Quizás puedas combinarlos entonces, pero supongo que es un diseño modular, lo que significa que, la mayoría de las veces, no se pueden combinar.

También podría cargar los archivos DLL en uso, en lugar de abrir el programa y solo cargar los archivos DLL necesarios para cargar el programa al inicio.

O incluso podría retrasar la carga de DLL iniciando primero el programa con las DLL necesarias y luego cargando las otras, en orden de importancia para su uso.

+0

Modular no tiene que significar cantidades excesivas de DLL. –

+0

Eso es correcto. Pero algunos patrones de diseño modular podrían interferir, cuando desee cambiar la carga o la estructura del archivo. – Michiel

1

Si tiene acceso al código de las dlls (o algunas de ellas) puede buscar candies para enlazar estáticamente. Si puede convertir muchos de ellos en bibliotecas estáticas, puede acelerar el inicio dramáticamente.

1

Utilice la construcción diferida de objetos estáticos.

En lugar de tener variables globales que se crean durante la puesta en marcha, así:

Foo foo; 
Bar bar; 

int main() 
{ 
    // Access foo and bar 
} 

tenerlos construidos en la demanda con el siguiente lenguaje:

Foo & foo() 
{ 
    static Foo the_instance; 
    return the_instance; 
} 
Bar & bar() 
{ 
    static Bar the_instance; 
    return the_instance; 
} 

int main() 
{ 
    // Access objects through foo() and bar() 
} 

Esto le ahorrará algo de arranque tiempo de espera si los objetos son caros de crear (p. ej., tiene que crear grandes tablas de búsqueda o realizar IO pesado).

Sin embargo, esto no ayudará a cargar esas DLL.

1

Aquí está recibiendo buenos consejos. Tener muchas DLL es una de esas modas pasajeras que ahora estás pagando. Además, inicializarlos puede estar haciendo mucho más de lo que necesita.

Hay una forma simple de decir lo que se está tomando el tiempo. Inicie la aplicación en un IDE, como Visual Studio, y mientras se inicia, presione el botón "Pausa" y visualice la pila de llamadas. Haz esto varias veces. Cada vez, verá lo que está haciendo y, lo más importante, por qué. Si ves que está pasando mucho tiempo haciendo algo que realmente no necesitas, entonces eso te dice qué arreglar.

+0

Pobre perfil del hombre. Bonito. – Thomas

+0

@Thomas: Correcto, y es posible que se sorprenda de lo efectivo que es: http://stackoverflow.com/questions/926266/performance-optimization-strategies-of-last-resort/927773#927773 –

Cuestiones relacionadas