Documente Academic
Documente Profesional
Documente Cultură
P RE S E N T A:
ING. SISTEMAS COMPUTACIONALES
El objetivo de las técnicas de optimización es mejorar el programa objeto para que nos dé
un rendimiento mayor, se pueden clasificar o dividir de diversas formas.
Por una parte podemos hablar de aquellas técnicas que son dependientes de la máquina,
y aquellas que son independientes de la máquina (o sea, técnicas que sólo se pueden
aplicar a una determinada máquina objeto y técnicas que son aplicables a cualquier
máquina objeto).
OPTIMIZACION
El objetivo de las técnicas de optimización es mejorar el programa objeto para que nos dé
un rendimiento mayor. La mayoría de estas técnicas vienen a compensar ciertas
ineficiencias que aparecen en el lenguaje fuente, ineficiencias que son inherentes al
concepto de lenguaje de alto nivel, el cual suprime detalles de la máquina objeto para
facilitar la tarea de implementar un algoritmo.
Por último, comentar que por muchas optimizaciones que se hayan realizado para mejorar
el rendimiento de un programa, siempre se obtendrá un mejor rendimiento si se utiliza un
algoritmo mejor. Por todo ello, para obtener un buen programa lo primero es ver qué
algoritmo utilizamos y si no es posible desarrollar otro más eficiente. Una vez
implementado el mejor algoritmo, ya se puede entonces optimizar el código obtenido a
partir de él para mejorar el rendimiento del programa.
Figura 1.
TIPOS DE OPTIMIZACION
Locales.
Características:
Por ejemplo:
Ciclos.
Las principales optimizaciones que se realizan en los bucles son las siguientes:
1. Movimiento de código.
2. Eliminación de variables inducidas.
3. Sustitución de variables costosas por otras menos costosas.
Y también se suelen aplicar (aunque con menor importancia):
4. Expansión de código (loop unrolling).
5. Unión de bucles (loop jamming).
Para una máquina con registros -lo común en los procesadores actuales- las instrucciones
cuyos operando están en los registros de la máquina son más cortas y más rápidas que
aquellas que tratan con operando que están en la memoria. Es por tanto importante decidir
qué variables se deben almacenar en los registros (localización) y en qué registro se debe
almacenar cada variable (asignación). Existen diversas estrategias para la localización y
asignación de los registros.
Es frecuente asignar algún número fijo de registros que contengan las variables más
usadas en un bucle interno, sirviendo los registros restantes para las variables locales a
cada bloque básico.
CARACTERISTICAS:
Globales.
En algunos casos es mejor mantener variables globales para agilizar los procesos (el
proceso de declarar variables y eliminarlas toma su tiempo) pero consume más memoria.
Algunas optimizaciones incluyen utilizar como variables registros del CPU, utilizar
instrucciones en ensamblador.
Antes de realizar una optimización global es necesario crear el grafo de flujo de
ejecución. El grafo de flujo de ejecución representa todos los caminos posibles de
ejecución del programa. La información contenida en el grafo es útil para el
programador y el optimizador La optimización global a partir del análisis del grafo del
flujo de ejecución permite
Figura 2.
Mirilla.
CARACTERISTICAS:
- Tiene los saltos lo más cerca de las llamadas, siendo el salto lo más pequeño
posible
- Se utiliza en: C#, Java, Javacc, Pyton, Haskell, Ensamblador, Condiciones if,
Condiciones while, case.
DIFERENCIAS
LOCAL CICLOS MIRILLA
Reemplazan Es difícil saber el uso • tener los
operaciones exacto de algunas saltos lo más cerca
costosas de la instrucciones de las llamadas,
máquina por otras siendo el salto lo
menos costosas. más pequeño posible
Tabla1
COSTOS
Los costos son el factor más importante a tomar en cuenta a la hora de optimizar ya que
en ocasiones la mejora obtenida puede verse no reflejada en el programa final pero si ser
perjudicial para el equipo de desarrollo. La optimización de una pequeña mejora tal vez
tenga una pequeña ganancia en tiempo o en espacio pero sale muy costosa en tiempo en
generarla.
Pero en cambio si esa optimización se hace por ejemplo en un ciclo, la mejora obtenida
puede ser N veces mayor por lo cual el costo se minimiza y es benéfico la mejora.
• Por ejemplo: for(int i=0; i < 10000; i++); si la ganancia es de 30 ms 300s
Ejecución.
Los costos de ejecución son aquellos que vienen implícitos al ejecutar el programa.
En algunos programas se tiene un mínimo para ejecutar el programa, por lo que el
espacio y la velocidad de los microprocesadores son elementos que se deben optimizar
para tener un mercado potencial más amplio.
Ejemplo:
Las aplicaciones multimedia como los videojuegos tienen un costo de
Ejecución alto por lo cual la optimización de su desempeño es crítico, la gran
Mayoría de las veces requieren de procesadores rápidos (e.g. tarjetas de
Video) o de mucha memoria.
Otro tipo de aplicaciones que deben optimizarse son las aplicaciones para
Dispositivos móviles.
Los dispositivos móviles tiene recursos más limitados que un dispositivo de
Cómputo convencional razón por la cual, el mejor uso de memoria y otros
Recursos de hardware tiene mayor rendimiento.
En algunos casos es preferible tener la lógica del negocio más fuerte en otros
Dispositivos y hacer uso de arquitecturas descentralizadas como
Cliente/servidor o P2P.
Las técnicas de gestión de la memoria durante la ejecución del programa difieren de unos
lenguajes a otros, e incluso de unos compiladores a otros.
Para lenguajes imperativos, los compiladores generan programas que tendrán en tiempo
de ejecución una organización de la memoria similar (a grandes rasgos) a la que aparece
en la figura 3.
Figura 3
La mejor manera de optimizar el código es hacer ver a los programadores que
Optimicen su código desde el inicio, el problema radica en que el costo podría
Ser muy grande ya que tendría que codificar más y/o hacer su código más
Legible.
Los criterios de optimización siempre están definidos por el compilador
Muchos de estos criterios pueden modificarse con directivas del compilador
Desde el código o de manera externa.
Este proceso lo realizan algunas herramientas del sistema como los
Ofuscadores para código móvil y código para dispositivos móviles.
Existen algunas herramientas que permiten el análisis de los flujos de datos, entre ellas
tenemos los depuradores y des ambladores. La optimización al igual que la programación
es un arte y no se ha podido sistematizar del todo.
Para que el compilador pueda realizar la mayoría de las optimizaciones vistas hasta ahora,
es necesario que posea información de todo el programa, para poder determinar si una
variable está viva, o si dos sub expresiones son comunes, o si una variable se puede
sustituir por un valor constante, etc.
MAPA
CONCLUCIONES
Después de todo este análisis obtenemos que la optimización de código no solo nos
permite hacer más agiles los programas sino que también es la fase de optimización de
código consiste en mejorar el código intermedio, de modo que resulte un código máquina
más rápido de ejecutar. Esta fase de la etapa de síntesis es posible sobre todo si el
traductor es un compilador (difícilmente un intérprete puede optimizar el código objeto).
Hay mucha variación en la cantidad de optimización de código que ejecutan los distintos
compiladores. En los que hacen mucha optimización, llamados «compiladores
optimizadores», una parte significativa del tiempo del compilador se ocupa en esta fase.
Sin embargo, hay optimizaciones sencillas que mejoran sensiblemente el tiempo de
ejecución del programa objeto sin retardar demasiado la compilación.
REFERENCIAS
Aho (2006), et. Al. Compiladores: Principios y Técnicas. Segunda Edición.