9
Unidad 7 Optimización 7.1 Tipos de Optimización Existe dos tipos de optimizaciones las optimizaciones dependientes de la máquina y las optimizaciones independientes de la maquina las cuales se describirán brevemente. Optimizadores independientes de la máquina Optimización por reducción simple.-Se realizan sobre los elementos de una expresión aritmética cuando todos ellos son conocidos. Optimización por reacondicionamiento de interrupciones.- En ocasiones es posible reestructurar una expresión dada de forma que se evite en lo posible el uso de variables temporales. De las expresiones aritméticas en muchas ocasiones basta de disponer de otra forma el acomodo de los elementos para dar con el objetivo deseado. Optimización por reducción de potencia.-Este modelo consiste en eliminar operaciones completas cambiándolas por operaciones de más fácil realización, que utilicen menos recursos y se resuelvan en menos tiempo. De esta forma una potencia puede ser remplazada por una serie de multiplicaciones. Optimización por reducción de frecuencia.- La repetición innecesaria para la lógica de programación de una serie de instrucciones es una circunstancia bastante común entre programadores de poca experiencia. Un buen optimizador de

Unidad 7

Embed Size (px)

Citation preview

Page 1: Unidad 7

Unidad 7 Optimización

7.1 Tipos de Optimización

Existe dos tipos de optimizaciones las optimizaciones dependientes de la máquina y las optimizaciones independientes de la maquina las cuales se describirán brevemente.

Optimizadores independientes de la máquina

Optimización por reducción simple.-Se realizan sobre los elementos de una expresión aritmética cuando todos ellos son conocidos.

Optimización por reacondicionamiento de interrupciones.- En ocasiones es posible reestructurar una expresión dada de forma que se evite en lo posible el uso de variables temporales. De las expresiones aritméticas en muchas ocasiones basta de disponer de otra forma el acomodo de los elementos para dar con el objetivo deseado.

Optimización por reducción de potencia.-Este modelo consiste en eliminar operaciones completas cambiándolas por operaciones de más fácil realización, que utilicen menos recursos y se resuelvan en menos tiempo. De esta forma una potencia puede ser remplazada por una serie de multiplicaciones.

Optimización por reducción de frecuencia.- La repetición innecesaria para la lógica de programación de una serie de instrucciones es una circunstancia bastante común entre programadores de poca experiencia. Un buen optimizador de código deberá de desplazar este tipo de operaciones hacia lugares del programa donde su ejecución sea lo menos reiterada posible.

Optimizadores dependientes de la maquina

Este tipo de optimizadores utiliza para su realización recursos de la estructura interna de la arquitectura de la computadora. Considera el uso de operaciones y registros que agilicen el procesamiento de alguna expresión aritmética.

Habitualmente los compiladores permiten introducir las optimizaciones de código como opciones de compilación. Las opciones habituales son velocidad de ejecución y tamaño del ejecutable. Ambas optimizaciones son opuestas, es decir

Page 2: Unidad 7

si se quiere mejorar la velocidad suele implicar incrementar el tamaño del ejecutable.

Los optimizadores se pueden plantear como:

Optimizadores locales. Son las que se realizan secuencialmente dentro de un bloque de código. Son las más sencillas de realizar.

Optimizador de bucles. Se realizan para optimizar bucles. Optimización del flujo de un programa. Es la más compleja y habitualmente

se realizan por medio de teoría de grafos.

7.1.1 Locales

Algunas de las optimizaciones locales independientes de la máquina objeto se presentan a continuación:

Reducción o precálculo de constantes. Consiste en realizar las operaciones con constantes antes de generar código. Así (2+3)*5 podría generar en una pila

Fusión de constantes. suele realizarse con las constantes de cadena. Así el uso de la misma constante dos o más veces tan sólo genera código para una constante, el resto son la referencia a la misma constante.

Reacondicionamiento de instrucciones. También se cambia en algunos casos en algunos casos el orden de evaluación, para generar código optimizado.

Comprobación de los rangos y de desbordamiento de la pila. Una vez que los programas compilados han sido probados, pueden quitarse del compilador las opciones de comprobación de rangos y las opciones de comprobación de desbordamientos de la pila. Al generar el código correspondiente para generar dichas comprobaciones.

Uso de operadores de desplazamiento de bits en vez multiplicación y división. Las operaciones como x*a, donde a es una constante y potencia de 2, se puede generar código con operaciones de desplazamiento. Lo mismo ocurre para operaciones de la forma x/a.

Eliminación de código muerto. El código que no se ejecuta no debe generar código. Así los bucles vacíos no generan código.

Page 3: Unidad 7

Unidad 7 Optimización

7.1 Tipos de Optimización

Las optimizaciones pueden realizarse de diferentes formas. Las optimizaciones se realizan en base al alcance ofrecido por el compilador. La optimización va a depender del lenguaje de programación y es directamente proporcional al tiempo de compilación; es decir, entre más optimización mayor tiempo de compilación.

Como el tiempo de optimización es gran consumidor de tiempo (dado que tiene que recorrer todo el árbol de posibles soluciones para el proceso de optimización) la optimización se deja hasta la fase de prueba final.

La optimización es un proceso que tiene a minimizar o maximizar alguna variable de rendimiento, generalmente tiempo, espacio, procesador, etc. Desafortunamente no existen optimizador que hagan un programa más rápido y que ocupe menor espacio.

La optimización se realiza reestructurando el código de tal forma que el nuevo código generado tenga mayores beneficios. La mayoría de los compiladores tienen una optimización baja, se necesita de compiladores especiales para realmente optimizar el código.

7.1.1 Locales

La optimización local se realiza sobre módulos del programa. En la mayoría de las ocasiones a través de funciones, métodos, procedimientos, clases, etc. La característica de las optimizaciones locales es que sólo se ven reflejados en dichas secciones.

La optimización local sirve cuando un bloque de programa o sección es crítico por ejemplo: la E/S, la concurrencia, la rapidez y confiabilidad de un conjunto de instrucciones. Como el espacio de soluciones es más pequeño la optimización local es más rápida7.1.2 Bucles• Los ciclos son una de las partes másesenciales en el rendimiento de un programadado que realizan acciones repetitivas, y sidichas acciones están mal realizadas, elproblema se hace N veces más grandes.• La mayoría de las optimizaciones sobreciclos tratan de encontrar elementos que no

Page 4: Unidad 7

deben repetirse en un ciclo.

Ciclos• while(a == b)• {• int c = a;• c = 5; …;• }• En este caso es mejor pasar el int c =a; fueradel ciclo de ser posible.

• El problema de la optimización en ciclos y engeneral radica es que muy difícil saber el usoexacto de algunas instrucciones. Así que notodo código de proceso puede seroptimizado.• Otros uso de la optimización pueden ser elmejoramiento de consultas en SQL o enaplicaciones remotas (sockets, E/S, etc.)

7.1.3 Globales• La optimización global se da con respecto atodo el código.• Este tipo de optimización es más lenta peromejora el desempeño general de todoprograma.• Las optimizaciones globales puedendepender de la arquitectura de la máquina.

En algunos casos es mejor mantenervariables globales para agilizar los procesos(el proceso de declarar variables yeliminarlas toma su tiempo) pero consumemás memoria.• Algunas optimizaciones incluyen utilizarcomo variables registros del CPU, utilizarinstrucciones en ensamblador.

La optimización de mirilla trata de estructurarde manera eficiente el flujo del programa,sobre todo en instrucciones de bifurcacióncomo son las decisiones, ciclos y saltos derutinas.• La idea es tener los saltos lo más cerca delas llamadas, siendo el salto lo más pequeñoposible.

Page 5: Unidad 7

Los costos son el factor más importante atomar en cuenta a la hora de optimizar yaque en ocasiones la mejora obtenida puedeverse no reflejada en el programa final perosi ser perjudicial para el equipo de desarrollo.• La optimización de una pequeña mejora talvez tenga una pequeña ganancia en tiempoo en espacio pero sale muy costosa entiempo en generarla.

Pero en cambio si esa optimización se hacepor ejemplo en un ciclo, la mejora obtenidapuede ser N veces mayor por lo cual el costose minimiza y es benéfico la mejora.• Por ejemplo: for(int i=0; i < 10000; i++); si laganancia es de 30 ms 300s7.2.1 Costo de ejecución.• Los costos de ejecución son aquellos quevienen implícitos al ejecutar el programa.• En algunos programas se tiene un mínimopara ejecutar el programa, por lo que elespacio y la velocidad del microprocesadoresson elementos que se deben optimizar paratener un mercado potencial más amplio.Las aplicaciones multimedias como losvideojuegos tienen un costo de ejecución altopor lo cual la optimización de su desempeñoes crítico, la gran mayoría de las vecesrequieren de procesadores rápidos (e.g.tarjetas de video) o de mucha memoria.• Otro tipo de aplicaciones que debenoptimizarse son las aplicacione sparadispositivos móviles.Los dispositivos móviles tiene recursos máslimitados que un dispositivo de cómputoconvencional razón por la cual, el mejor uso dememoria y otros recursos de hardware tiene mayorrendimiento.• En algunos casos es preferible tener la lógica delnegocio más fuerte en otros dispositivos y haceruso de arquitecturas descentralizadas comocliente/servidor o P2P.7.2.2 Criterios para mejorar elcódigo• La mejor manera de optimizar el código eshacer ver a los programadores que optimicensu código desde el inicio, el problema radica

Page 6: Unidad 7

en que el costo podría ser muy grande yaque tendría que codificar más y/o hacer sucódigo mas legible.• Los criterios de optimización siempre estándefinidos por el compiladorMuchos de estos criterios puedenmodificarse con directivas del compiladordesde el código o de manera externa.• Este proceso lo realizan algunasherramientas del sistema como losofuscadores para código móvil y código paradispositivos móviles.7.2.3 Herramientas para elanálisis del flujo de datos• Existen algunas herramientas que permitenel análisis de los flujos de datos, entre ellastenemos los depuradores y desambladores.• La optimización al igual que la programaciónes un arte y no se ha podido sistematizar deltodo.

Page 7: Unidad 7