Vous êtes sur la page 1sur 29

Optimizacin de cdigo

Introduccion
La finalidad de la optimizacin de cdigo es producir un
cdigo objeto lo ms eficiente posible. En algunos casos
tambin se realiza una optimizacin del cdigo intermedio.
Algunas optimizaciones que se pueden realizar son la
evaluacin de expresiones constantes, el uso de ciertas
propiedades de los operadores, tales como la asociativa,
conmutativa, y distributiva; as como la reduccin de
expresiones comunes

Objetivo
Obtener cdigo que se ejecuta ms eficientemente segn los
Criterios

Tiempo de ejecucin (optimizacin temporal)


Espacio de memoria utilizado (optimizacin espacial)

Funcionamiento
Revisa el cdigo generado a varios niveles de abstraccin y
realiza las optimizaciones aplicables al nivel de abstraccin.

Representaciones de cdigo intermedio de ms a


menos abstractas.

rbol sintctico abstracto: optimizar


subexpresiones redundantes, reduccin de
frecuencia, etc.

Tuplas

o cudruplas: optimizar en uso de los


registros o de las variables temporales.

Ensamblador/Cdigo

mquina: convertir saltos a


saltos cortos, reordenar instrucciones.

Representaciones de cdigo para extraer


informacin: grafos.

Condiciones

El cdigo optimizado se ha de comportar igual


que el cdigo de partida excepto por ser ms
rpido o ocupar menos espacio.

Hay que buscar transformaciones que no


modifiquen el comportamiento del cdigo segn
el comportamiento definido para el lenguaje de
programacin.

La optimizacin se realiza despus de la generacin de


cdigo de todo el programa o de un elemento ejecutable
del programa (funcin, procedimiento, etc).

Dependiente del contexto

Clasificacion de las optimizaciones

En funcin de
dependencia

Dependientes
de la maquina
Independientes
de la maquina

optimizacin
En funcin
mbito
aplicacin

Optimizacin
locales
Optimizacin
global

Optimizaciones locales
1.

Ejecucin en tiempo de compilacin

Preclculo de expresiones constantes


i=2 + 3

j=4
f = j + 2.5

i=5

j=4

f=6.5

2. Reutilizacin de expresiones comunes


a = b+ c

a= b+ c

d =a-d

d = a-d

e = b+c
f = a-d

e=a
f=a-d

3. Propagacin de copias
Antes de sustituir f =a, sustituir todos los usos de f por a
a=3+i
f=a

a= 3 + i

b = f+c

b=a+c

d = a+ m

d=a+m

m = f+d

m=a+ d

4. Eliminacin en redundancias en acceso a matrices


Localizar expresiones comunes en calculo de direcciones de matices
Cod. fuente:
A: array [1..4, 1..6, 1..8] of integer

A[i,j,5] := A[i,j,6] + A[i,j,4]

Sin optimizacion:

direc(A[i,j,5]) = direc(A[1,1,1]) + (i-1)*6*8 + (j-1)*8 + (5-1)


direc(A[i,j,6]) = direc(A[1,1,1]) + (i-1)*6*8 + (j-1)*8 + (6-1)
direc(A[i,j,4]) = direc(A[1,1,1]) + (i-1)*6*8 + (j-1)*8 + (4-1)

Con optimizacion:

k := direc(A[1,1,1]) + (i-1)*6*8 + (j-1)*8 + (5-1)


direc(A[i,j,5]) = k + 4
direc(A[i,j,6]) = k + 5
direc(A[i,j,4]) = k + 3

5. Transformaciones algebraicas
Aplicar propiedades matemticas para simplificar expresiones
a) Eliminacin secuencias nulas
x+0x
1*xx

x / 1 x
...

b) Reduccin de potencia
Reemplazar una operacin por otra equivalente menos costosa
x2

2*x

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

4*x, 8*x,...

x<<2, x<<3,...

x/2

x>>2

c) Reacondicionamiento de operadores
Cambiar orden de evaluacin aplicando propiedades conmut.,
asociativa y distributiva

A := B*C*(D + E)

A := (D + E)*B*C

MOV B,R0
MUL C,R0

MOV D,R0

MOV R0, t1

ADD E, R0

MOV D,R0

MUL B,R0

5 instrucciones

ADD E,R0

MUL C,R0

0 temporales

MUL t1,R0
MOV R0,A

MOV R0,A

Optimizacion mirilla
Idea Bsica

Se recorre el cdigo buscando combinaciones de


instrucciones que puedan ser reemplazadas por otras
equivalentes mas eficientes.

Se utiliza una ventana de n instrucciones y un conjunto de


patrones de transformacin (patrn, secuencias
reemplazan.)

Si las instrucciones de la ventana encajan con algn


patrn se reemplazan por lo secuencia de
reemplazamiento asociada.

Las nuevas instrucciones son reconsideradas para las


futuras optimizaciones

Ejemplos:

Eliminacion de cargas innecesarias


MOV Ri, X
MOV X, Rj

MOV Ri, Rj

Reduccion de potencia

Eliminacion de cadenas de saltos

if C goto L1
L1: goto L2

if C goto L2

__________________________________________________________________
if C goto L1

goto FIN
L1: ...

if not C goto FIN


L1:

...

FIN:

FIN:

Optimizaciones globales
Optimizaciones entre Bloques Bsicos
Optimizaciones tpicas:

Identificacin de expresiones comunes entre bloques


afecta a la asignacin de registros entre B.B.

Optimizacin de llamadas a procedimientos

Optimizacin de bucle

Optimizacin Llamadas a Procedimientos

Llamadas a procedimientos son muy costosas

cambios del mbito de referencias

gestin de Registros de Activacin

paso de parmetros + asignacin de datos locales

Mejoras

1. Optimizar manejo de Reg. Activacin

minimizar copia de parmetros y no registros a salvar

uso almacenamiento esttico si no hay llamadas recursivas

Expansin en lnea

Idea: Eliminar llamadas a proc., \copiando" el cuerpo del


proc. en el lugar donde es llamado

Evita sobrecarga asociada con llamadas a proc.

Permite optimizaciones adicionales

el cdigo llamado pasa a ser parte del cdigo que lo


llama

Limitaciones

Aumenta uso de memoria ) til en proc. pequeos y


llamados desde pocos lugares

si se llama en un nico lugar (es frecuente), no


supone coste de espacio
adicional

No aplicable en proc. recursivos

Ejemplos

Directiva inline en C++ (en Java el compilador hace la expansin de forma


automtica)

En C puede simularse con macros #define

Optimizacin de Bucles
Idea: Centrar optimizacin en partes mas usadas, no en todo
el programa
Optimizar bucles internos

Mejoras:

factorizacin de expresiones invariantes

reduccin de intensidad y eliminacin de variables de


induccin

Factorizacin de expresiones invariantes

Expr. invariantes de bucle: expr. cuyo valor es constante


durante toda la ejecucin del bucle
incluyen constantes y/o variables no modificadas en el
cuerpo del bucle

Idea: Mover expr. invariantes desde el cuerpo hasta la


cabeza del bucle
al sacarlas del bucle, pueden quedar dentro de otro bucle
externo
repetir proceso

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.

Si la 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++); mm la ganancia


es de 30 ms 300s

Costos 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 de los
microprocesadores son elementos que se deben optimizar
para tener un mercado potencial ms amplio.

Las aplicaciones multimedia 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


aplicaciones para dispositivos mviles.

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.

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

Los criterios de optimizacin siempre estn definidos por


el compilador

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.

Vous aimerez peut-être aussi