Sie sind auf Seite 1von 12

1.

- INTRODUCCION

Idealmente, los compiladores deberan producir cdigo objeto que fuera tan bueno como si
estuviera escrito directamente por un buen programador. La realidad es que esto es dificil de
conseguir y muy pocas veces se alcanza esa meta.

Sin embargo, el cdigo generado por el compilador puede ser mejorado por medio de unas
transformaciones que se han denominado tradicionalmente optimizaciones, aunque el trmino
optimizacin es impropio ya que raramente se consigue que el cdigo generado sea el mejor
posible.

El objetivo de las tcnicas de optimizacin es mejorar el programa objeto para que nos d un
rendimiento mayor. La mayora de estas tcnicas 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 mquina objeto para facilitar la tarea de implementar un
algoritmo. Las distintas tcnicas de optimizacin se pueden clasificar o dividir de diversas formas.

Por una parte podemos hablar de aquellas tcnicas que son dependientes de la mquina, y
aquellas que son independientes de la mquina (o sea, tcnicas que slo se pueden aplicar a una
determinada mquina objeto y tcnicas que son aplicables a cualquier mquina objeto).

Por otra parte, las tcnicas de optimizacin se dividen tambin en locales y globales. Las tcnicas
de optimizacin locales analizarn slo pequeas porciones de cdigo y en ellas realizarn
mejoras, mientras que para la aplicacin de las tcnicas globales ser necesario el anlisis de todo
el cdigo.

Cada optimizacin est basada en una funcin de coste y en una transformacin que preserve el
significado del programa. Mediante la funcin de coste queremos evaluar la mejora que hemos
obtenido con esa optimizacin y si compensa con el esfuerzo que el compilador realiza para poder
llevarla a cabo.

Los criterios ms comunes que se suelen emplear son el ahorro en el tamao del cdigo, la
reduccin del tiempo de ejecucin y la mejora de las necesidades del espacio para los datos del
programa.

En cuanto a preservar el significado del programa, es lgico que no tendra sentido realizar
optimizaciones que modificaran el comportamiento del programa. Aunque parezca evidente,
puede haber complicadas optimizaciones que fallen en ese aspecto.

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 ms eficiente. Una vez implementado el mejor algoritmo, ya se puede
entonces optimizar el cdigo obtenido a partir de l para mejorar el rendimiento del programa.
OPTIMIZACIN

Las optimizaciones pueden realizarse de diferentes formas. Las optimizaciones se realizan en base
al alcance ofrecido por el compilador. La optimizacin va a depender del lenguaje de
programacin y es directamente proporcional al tiempo de compilacin; es decir, entre ms
optimizacin mayor tiempo de compilacin. Como el tiempo de optimizacin es gran consumidor
de tiempo (dado que tiene que recorrer todo el rbol de posibles soluciones para el proceso de
optimizacin) la optimizacin se deja hasta la fase de prueba final.

Algunos editores ofrecen una versin de depuracin y otra de entrega o final. La optimizacin es
un proceso que tiene a minimizar o maximizar alguna variable de rendimiento, generalmente
tiempo, espacio, procesador, etc. Desafortunadamente no existen optimizadores que hagan un
programa ms rpido y que ocupe menor espacio.

La optimizacin se realiza reestructurando el cdigo de tal forma que el nuevo cdigo generado
tenga mayores beneficios. La mayora de los compiladores tienen una optimizacin baja, se
necesita de compiladores especiales para realmente optimizar el cdigo.

3.1 TIPOS DE OPTIMIZACIN

Existen diversas tcnicas de optimizacin que se aplican al cdigo generado para un programa
sencillo. Por programa sencillo entendemos aquel que se reduce a un slo procedimiento o
subrutina. Las tcnicas de optimizacin a travs de varios procedimientos se reducen a aplicar las
vistas aqu a cada uno de los procedimientos y despus realizar un anlisis interprocedural.

Este ltimo tipo de anlisis no lo vamos a desarrollar en este artculo. Partiendo de un programa
sencillo, obtenemos cdigo intermedio de tres direcciones [AHO77], pues es una representacin
adecuada del programa sobre la que emplear las diversas tcnicas de optimizacin.

A partir de aqu dividimos el programa en bloques bsicos [AHO86], o secuencia de sentencias en


las cuales el flujo de control empieza al principio y acaba al final, sin posibilidad de parar o de
tener saltos.

Las sentencias de un bloque bsico constituyen una unidad sobre la cual se aplican las
optimizaciones locales. Estas optimizaciones se pueden dividir en:

a) Optimizaciones que no modifican la estructura.

Son:

1. Eliminacin de sub-expresiones comunes.

2. Eliminacin de cdigo muerto.

3. Renombrar variables temporales.

4. Intercambio de sentencias independientes adyacentes.

b) Transformaciones algebraicas.

Son aquellas transformaciones que simplifican expresiones y/o reemplazan operaciones costosas
de la mquina por otras menos costosas. Adems de este tipo de optimizaciones locales a un
bloque bsico, existe otro tipo de optimizaciones an ms locales, pues su mbito se reduce a una
breve secuencia de instrucciones.

A este tipo de optimizacin local se le llama optimizacin peephole, e intenta mejorar el


rendimiento del programa por medio de reemplazar esa breve secuencia de instrucciones objeto
por otra secuencia ms corta y/o ms rpida. Hay varios tipos de optimizacin peephole, siendo
los ms usuales los siguientes:

1. Eliminacin de instrucciones redundantes.

2. Optimizaciones en el flujo de control.

3. Simpificaciones algebraicas.

4. Uso de instrucciones mquina especficas.

Debido a la naturaleza de este tipo de optimizacin, su salida es susceptible de ser optimizada de


nuevo, con lo que sern necesarias varias pasadas para lograr la mxima optimizacin. Una
aplicacin de este tipo de optimizacin se puede encontrar en el kit ACK desarrollado por
Tanembaum [Tane82], donde se describen 123 combinaciones distintas de sentencias de cdigo
intermedio con sus correspondientes equivalencias

Las tcnicas de optimizacin global se basan todos ellos en el anlisis global de flujo de datos. Este
anlisis se realiza para el cdigo de todo el programa, es decir, a lo largo de los distintos bloques
bsicos que forman el cdigo del programa. Suponiendo que tenemos la informacin que nos
proporciona este anlisis, que lo veremos en el siguiente apartado, hay dos tipos de
optimizaciones importantes que se realizan:

la localizacin y la asignacin global de registros para las variables, y las optimizaciones que se
realizan en los bucles.Las optimizaciones pueden realizarse de diferentes formas. Las
optimizaciones se realizan en base al alcance ofrecido por el compilador.

La optimizacin va a depender del lenguaje de programacin y es directamente proporcional al


tiempo de compilacin; es decir, entre ms optimizacin mayor tiempo de compilacin Como el
tiempo de optimizacin es gran consumidor de tiempo (dado que tiene que recorrer todo el rbol
de posibles soluciones para el proceso de optimizacin) la optimizacin se deja hasta la fase de
prueba final.

Algunos editores ofrecen una versin de depuracin y otra de entrega o final. La optimizacin 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 ms rpido y que ocupe menor espacio.

La optimizacin se realiza reestructurando el cdigo de tal forma que el nuevo cdigo generado
tenga mayores beneficios. La mayora de los compiladores tienen una optimizacin baja, se
necesita de compiladores especiales para realmente optimizar el cdigo.
3.1.1 LOCALES

La optimizacin local se realiza sobre mdulos del programa. En la mayora de las ocasiones a
travs de funciones, mtodos, procedimientos, clases, etc. La caracterstica de las optimizaciones
locales es que slo se ven reflejados en dichas secciones.

La optimizacin local sirve cuando un bloque de programa o seccin es crtico por ejemplo: la E/S,
la concurrencia, la rapidez y confiabilidad de un conjunto de instrucciones. Como el espacio de
soluciones es ms pequeo la optimizacin local es ms rpida

Las caractersticas de las optimizaciones locales es que solo se ven reflejados en dichas secciones.
La optimizacin local sirve cuando un bloque de programa o seccin es crtico por ejemplo: la E/S,
la concurrencia, la rapidez y confiabilidad de un conjunto de instrucciones.

Las optimizaciones locales se realizan sobre el bloque bsico

Optimizaciones locales

Folding

Propagacin de constantes

Reduccin de potencia

Reduccin de subexpresiones comunes

Bloque Bsico

Un bloque bsico es un fragmento de cdigo que tiene una nica entrada y salida, y cuyas
instrucciones se ejecutan secuencialmente. Implicaciones:

Si se ejecuta una instruccin del bloque se ejecutan todas en un orden conocido en tiempo de
compilacin.

La idea del bloque bsico es encontrar partes del programa cuyo anlisis necesario para la
optimizacin sea lo ms simple posible.
Ensamblamiento (Folding)

El ensamblamiento es remplazar las expresiones por su resultado cuando se pueden evaluar en


tiempo de compilacin (resultado constante).

Ejemplo: A=2+3+A+C -> A=5+A+C

Estas optimizaciones permiten que el programador utilice clculos entre constantes


representados explcitamente sin introducir ineficiencias.

Implementacin del Folding

Implementacin del floding durante la generacin de cdigo realizada conjuntamente con el


anlisis sintctico.

Se aade el atributo de constante temporal a los smbolos no terminales y a las variables de la


tabla de smbolos.

Se aade el procesamiento de las constantes a las reglas de anlisis de expresiones.

Optimiza: 2+3+b -> 5+b

Hay una suma de constantes (2+3)+b

No optimiza: 2+b+3 -> 2+b+3

No hay una suma de constantes (2+b)+3

Implementacin del Folding


Implementacin posterior a la generacin de cdigo

Buscar partes del rbol donde se puede aplicar la propiedad conmutativa:

Sumas/restas: como la resta no es conmutativa se transforma en sumas: a+b-c+d -> a+b+(-c)+d

Productos/divisiones: como la divisin no es conmutativa se transforma en productos: a*b/c*e -


> a*b*(1/c)*e

Buscar las constantes y operarlas

Reconstruir el rbol.

Propagacin de constantes

Desde que se asigna a una variable un valor constante hasta la siguiente asignacin, se considera
a la variable equivalente a la constante.

Ejemplo: Propagacin Ensamblamiento

PI=3.14 -> PI=3.14 -> PI=3.14

G2R=PI/180 -> G2R=3.14/180 -> G2R=0.017

PI y G2R se consideran constantes hasta la prxima asignacin.

Estas optimizaciones permiten que el programador utilice variables como constantes sin
introducir ineficiencias. Por ejemplo en C no hay constantes y ser lo mismo utilizar

Int a=10;

#define a 10

Con la ventaja que la variable puede ser local.


Actualmente en C se puede definir const int a=10;

implementacin de la Propagacin de Constantes

Separar el rbol en bloques bsicos

Cada bloque bsico ser una lista de expresiones y asignaciones

Para cada bloque bsico

Inicializar el conjunto de definiciones a conjunto vaco.

Definicin: (variable,constante)

Procesar secuencialmente la lista de expresiones y asignaciones

Para expresin y asignacin

Sustituir las apariciones de las variables que se encuentran en el conjunto de definiciones por sus
constantes asociadas.

Para asignaciones

Eliminar del conjunto de definiciones la definicin de la variable asignada

Aadir la definicin de la variable asignada si se le asigna una constante.


Ejecuci on en tiempo de compilaci on
Precalcular expresiones constantes (con constantes o variables cuyo valor no cambia)
i=2+3!i=5
j=4
f = j + 2.5
!
j=4
f = 6.5
2. Reutilizaci on 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 on 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
Reducci on de potencia

Reemplazar una operaci on por otra equivalente menos costosa

x2 ! x * x

2*x ! x + x (suma); x<<1 (despl. izq.)

4*x, 8*x,... ! x<<2, x<<3,...

x / 2 ! x>>2

EJEMPLOS:

1- Ejecucin en tiempo de compilacin

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- Reutilizacin de expresiones comunes

a=b+c

d=a-d

e=b+c

f=a-d

a=b+c

d=a-d

e=a

f=ad
3- Propagacin 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- Eliminacin redundancias en acceso matrices

Localizar expresiones comunes en clculo direcciones de matrices.

5- Transformaciones algebraicas:

Aplicar propiedades matemticas para simplificar expresiones

o Eliminacin secuencias nulas

o Reduccin de potencia

o Reacondicionamiento de operandos

3.1.2 Bucles

Los ciclos son una de las partes ms esenciales en el rendimiento de un programa dado que
realizan acciones repetitivas, y si dichas acciones estn mal realizadas, el problema se hace N
veces ms grandes.

La mayora de las optimizaciones sobre ciclos tratan de encontrar elementos que no deben
repetirse en un ciclo.

Ciclos
while(a == b)

int c = a;

c = 5; ;

En este caso es mejor pasar el int c =a; fuera del ciclo de ser posible. Ciclos

El problema de la optimizacin en ciclos y en general radica es que muy difcil saber el uso exacto
de algunas instrucciones. As que no todo cdigo de proceso puede ser optimizado.

Otros uso de la optimizacin pueden ser el mejoramiento de consultas en SQL o en aplicaciones


remotas (sockets, E/S, etc.)

3.1.3 Globales

La optimizacin global se da con respecto a todo el cdigo.

Este tipo de optimizacin es ms lenta pero mejora el desempeo general de todo programa.

Las optimizaciones globales pueden depender de la arquitectura de la mquina. Optimizacin


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 ms memoria.

Algunas optimizaciones incluyen utilizar como variables registros del CPU, utilizar instrucciones
en ensamblador.

3.1.4 De mirilla

La optimizacin de mirilla trata de estructurar de manera eficiente el flujo del programa, sobre
todo en instrucciones de bifurcacin como son las decisiones, ciclos y saltos de rutinas.

La idea es tener los saltos lo ms cerca de las llamadas, siendo el salto lo ms pequeo posible

3.2 Costos

Los costos son el factor ms 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 optimizacin de una pequea mejora tal vez tenga una pequea ganancia en tiempo o en
espacio pero sale muy costosa en tiempo en generarla. Costos

Pero en cambio si esa optimizacin se hace por ejemplo en un ciclo, la mejora obtenida puede
ser N veces mayor por lo cual el costo se minimiza y es benfico la mejora.

Por ejemplo: for(int i=0; i < 10000; i++); si la ganancia es de 30 ms 300s


3.2.1 Costo de ejecucin.

Los costos de ejecucin son aquellos que vienen implcitos al ejecutar el programa.

En algunos programas se tiene un mnimo 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 ms amplio. Costos de ejecucin

Las aplicaciones multimedias como los videojuegos tienen un costo de ejecucin alto por lo cual
la optimizacin de su desempeo es crtico, la gran mayora de las veces requieren de
procesadores rpidos (e.g. tarjetas de video) o de mucha memoria.

Otro tipo de aplicaciones que deben optimizarse son las aplicacione spara dispositivos mviles.
Costos de ejecucin

Los dispositivos mviles tiene recursos ms limitados que un dispositivo de cmputo


convencional razn por la cual, el mejor uso de memoria y otros recursos de hardware tiene
mayor rendimiento.

En algunos casos es preferible tener la lgica del negocio ms fuerte en otros dispositivos y hacer
uso de arquitecturas descentralizadas como cliente/servidor o P2P.

3.2.2 Criterios para mejorar el cdigo

La mejor manera de optimizar el cdigo es hacer ver a los programadores que optimicen su
cdigo desde el inicio, el problema radica en que el costo podra ser muy grande ya que tendra
que codificar ms y/o hacer su cdigo mas legible.

Los criterios de optimizacin siempre estn definidos por el compilador Criterios de optimizacin
Muchos de estos criterios pueden modificarse con directivas del compilador desde el cdigo o de
manera externa.

Este proceso lo realizan algunas herramientas del sistema como los ofuscadores para cdigo
mvil y cdigo para dispositivos mviles.

3.2.3 Herramientas para el anlisis del flujo de datos

Existen algunas herramientas que permiten el anlisis de los flujos de datos, entre ellas tenemos
los depuradores y desambladores

La optimizacin al igual que la programacin es un arte y no se ha podido sistematizar del todo.

Das könnte Ihnen auch gefallen