OPTIMZACIÓN
3.1 Tipos de optimización
- Optimizaciones Globales
- Optimizaciones de Ciclo
- Optimización de Mirilla
- Optimizaciones Locales
La optimización es un
proceso que tiene a minimizar o maximizar alguna variable de rendimiento,
generalmente tiempo, espacio, procesador, etc.
La optimización se realiza reestructurando el código de tal
forma que el nuevo código generado tenga mayores beneficios.
La optimización busca mejorar la forma en que un programa
utiliza los recursos. 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.
Existen diversas técnicas de optimización se pueden
clasificar o dividir de diversas formas:
1) Dependientes
de la maquina: técnicas que solo se pueden aplicar a una determinada maquina
objeto.
2) Independientes
de la maquina: técnicas que son aplicables a cualquier maquina objeto.
3) Locales:
analizaran solo pequeñas porciones de código y en ellas realizaran mejoras.
4) Globales: será
necesario el análisis de todo el código.
TIPOS DE OPTIMIZACION
Técnicas de optimización que se aplican al código generado
para un programa sencillo (aquel que se reduce a un solo procedimiento o
subrutina).
3.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.
Las características de las
optimizaciones locales es que solo 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.
E• Las optimizaciones locales se realizan sobre el bloque básico
• Optimizaciones locales
– Folding
– Propagación de constantes
– Reducción de potencia
– Reducción de subexpresiones
comunes
Bloque Básico
• Un bloque básico es un
fragmento de código que tiene una única entrada y salida, y cuyas instrucciones
se ejecutan secuencialmente. Implicaciones:
– Si se ejecuta una instrucción
del bloque se ejecutan todas en un orden conocido en tiempo de compilación.
• La idea del bloque básico es encontrar partes del programa cuyo análisis necesario para la optimización sea lo más simple posible.
EJEMPLOS:
1- Ejecución en tiempo de compilación
Precalcular expresiones constantes (con constantes o
variables cuyo valor no cambia).
3 ! i = 5
j = 4
f = j + 2.5
!
j = 4
f = 6.5
2- Reutilización de expresiones comunes
a = b + c
d = a - d
e = b + c
f = a - d
!
a = b + c
d = a - d
e = a
f = a – d
3- Propagación de copias
Ante instrucciones f=a, sustituir
todos los usos de f por a.
a = 3 + i
f = a
b = f + c
d = a + m
m = f + d
!
a = 3 + i
b = a + c
d = a + m
m = a + d
4- Eliminación redundancias en acceso
matrices
Localizar expresiones comunes en
cálculo direcciones de matrices.
5- Transformaciones algebraicas:
Aplicar propiedades matemáticas
para simplificar expresiones
o Eliminación secuencias nulas
o Reducción de potencia
o Reacondicionamiento de operandos
3.1.2 Ciclos
Los ciclos son una de las partes
más esenciales en el rendimiento de un programa dado que realizan acciones
repetitivas, y si dichas acciones están mal realizadas, el problema se hace N
veces más grandes. La mayoría de las optimizaciones sobre ciclos tratan de
encontrar elementos que no deben repetirse en un ciclo.
El problema de la optimización en
ciclos y en general radica en que es muy difícil saber el uso exacto de algunas
instrucciones. Así que no todo código de proceso puede ser optimizado. Otro uso
de la optimización puede ser el mejoramiento de consultas en SQL o en
aplicaciones remotas (sockets, E/S, etc.).
3.1.3 Globales
La optimización global se da con
respecto a todo el código.
• Este tipo de optimización es
más lenta pero mejora el desempeño general de todo programa.
• Las optimizaciones globales
pueden depender de la arquitectura de la máquina.
Optimización global
• 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 instrucción es
enensamblador.
3.1.4 De mirilla
La optimización de mirilla trata
de estructurar de manera eficiente el flujo del programa, sobre todo en
instrucciones de bifurcación como son las decisiones, ciclos y saltos de
rutinas. La idea es tener los saltos lo más cerca de las llamadas, siendo el
salto lo más pequeño posible.
Ideas básicas:
Se recorre el código buscando
combinaciones de instrucciones que pueden ser reemplazadas por otras
equivalentes más eficientes.
Se utiliza una ventana de n
instrucciones y un conjunto de patrones de transformación (patrón, secuencias,
remplazan).
Las nuevas instrucciones son
reconsideradas para las futuras optimizaciones.
Ejemplos:
Eliminación de cargas
innecesarias
Reducción de potencia
Eliminación de cadenas de saltos
3.2 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.
3.2.1 Costo de ejecución. (memoria, registros, pilas).
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 del microprocesadores son elementos que se
deben optimizar para tener un mercado potencial más amplio. Costos de ejecución
• Las aplicaciones multimedias 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 vídeo) o de mucha memoria.
• Otro tipo de aplicaciones que deben optimizarse son las aplicaciones
para dispositivos móviles. Costos de ejecución
• 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.
3.2.2 Criterios para mejorar el código.
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 mas
legible.
• Los criterios de optimización siempre
están definidos por el compilador Criterios de optimización
• 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.
3.2.3 Herramientas para el análisis del flujo de datos
• Existen algunas herramientas
que permiten el análisis de los flujos de datos, entre ellas tenemos los
depuradores y desambladores.
• La optimización al igual que la
programación es un arte y no se ha podido sistematizar del todo.
Comentarios
Publicar un comentario