2011-04-10 14 views
6

Trabajando en un problema que requiere un GA. Tengo todo eso funcionando y pasé bastante tiempo recortando la grasa y optimizando el código antes de recurrir a la optimización del compilador. Debido a que el GA se ejecuta como resultado de la entrada del usuario, tiene que encontrar una solución dentro de un período de tiempo razonable, de lo contrario, la UI se parará y simplemente no funcionará del todo. Obtuve este GA binario resolviendo un problema variable de 27 en aproximadamente 0.1s en un iPhone 3GS.Optimización de algoritmo genético: utilizando el distintivo -O3

Para lograr este nivel de rendimiento, toda la GA se codificó en C, no en Objective-C.

En una búsqueda para una reducción adicional del tiempo de ejecución, estaba considerando la idea de usar el conmutador de optimización "-O3" solo para el módulo de solución. Lo intenté y redujo el tiempo de ejecución casi a la mitad.

¿Debería preocuparme por cualquier problema configurando la optimización en "-O3"? Tenga en cuenta que estoy haciendo esto a nivel de archivo y no para todo el proyecto.

+0

-O3 sigue siendo relativamente seguro siempre que el código que escribió sea "estándar" y no haga ningún truco específico. Incluso entonces, dado que el compilador del iPhone solo tiene que generar código de trabajo para un puñado de sistemas pequeños, es probable que esté bien. –

+0

Solo para agregar, si está preocupado por el bloqueo de la UI, puede considerar realizar el cálculo en un subproceso simultáneo. – David

+0

Pensé en agregar un hilo concurrente. El problema es que la forma en que se escribe el código en este momento no tiene datos para iniciar el GA hasta que el usuario interactúa con la interfaz de usuario. Para lanzar un hilo separado tendré que expandir la máquina de estado principal para hacer un trabajo de anticipación y predecir qué necesitará la GA. No es imposible, pero si puedo evitarlo haciendo que la GA vaya más rápido, preferiría pasar a problemas más apremiantes. Debo añadir que la salida de la GA determina cómo se verá la próxima actualización de UI. –

Respuesta

5

-O3 marca hará que el código funcione de la misma manera que antes (solo que más rápido), siempre y cuando no haga nada complicado que no sea seguro o dependa de lo que el compilador le haga.

Además, como se sugiere en los comentarios, podría ser una buena idea dejar que el cálculo se ejecute en un subproceso separado para evitar que la UI se bloquee. Eso también le da la flexibilidad para encarecer el cálculo, o mostrar una barra de progreso, o lo que sea.


cosas Tricky

Optimización se producir resultados inesperados si se intenta acceder a material en la pila directamente, o mover el puntero de pila en otro lugar, o si lo hace algo intrínsecamente ilegal, al igual olvide inicializar una variable (algunos compiladores (MinGW) los establecerán en 0).

E.g.

int main() { 
    int array[10]; 
    array[-2] = 13; // some negative value might get the return address 
} 

algunas otras cosas complicado implica el optimizador de relleno por sí mismo. Aquí hay un example de cuando -O3 rompe por completo el código.

+0

He aceptado tu respuesta. Sin embargo, sería bueno si pudieras cubrir "cosas complicadas" como sugirió alguien más. –

+0

Perdón por la demora, no tenía internet. Se agregaron algunas cosas que fallarán – evgeny

Cuestiones relacionadas