Está en la página 1de 18

Optimización de Integrantes:

-Gabriel Cordero
Código -Michael Pérez
-Anthony tejada

7-4
2
¿Qué es la optimización de código?

La optimización de código es el conjunto de fases de un compilador que transforman un


fragmento de código en otro fragmento con un comportamiento equivalente y que se ejecuta
de forma más eficiente, es decir, usando menos recursos de cálculo como memoria o tiempo
de ejecución.
La optimización en esta fase se compone tanto de optimizaciones locales como globales.
Posición del optimizador y del generador de código:
3

Bloques Básicos

▸ El paso previo a cualquier optimización es la división del


programa en bloques básicos. Un bloque básico es un
conjunto de instrucciones de programa que se ejecutan
de forma consecutiva sin posibilidad de salto.
▸ Por tanto, los bloques básicos del programa serán
aquellos fragmentos de código cuyas instrucciones no
sean saltos, ni el destino de un salto. La excepción es la
última instrucción de cada bloque básico, que sí puede
(debe) ser un salto. La primera instrucción de un bloque
básico se denomina como líder, y será el punto de
entrada al bloque.
4

Bloques Básicos
5

Tipos de Optimizaciones

▸ En función del ámbito de


aplicación
Optimizaciones locales
▸ Las optimizaciones locales, o
de ventana, son aquellas que
se efectúan dentro de un
bloque básico. Algunas de
ellas son:
6

Optimización Global

▸ Aplican sobre todo el programa,


explotando las relaciones entre varios
bloques básicos simultáneamente.
▸ Son dirigidas por Análisis de Flujo de
Datos (Data FlowAnalysis).
▸ Aplicables tanto a código intermedio
como a código final
▸ En general se aplican agresivamente al
intermedio.
7

En función de la dependencia de la arquitectura

▸ Peephole
Esta consiste en sustituir una secuencia
dada de instrucciones por una o varias
secuencias que realizan la misma acción
pero que son menos en números o más
rápidas de ejecución. Por tanto la
optimización peephole considera un
programa como un conjunto de pequeñas
series de instrucciones ,analizando
detenidamente cada una de ellas sin entrar
en consideraciones sobre el conjunto total.
8

Independiente de la Máquina

▸ 1. Propagación de Copias
Esta técnica considera las sentencias de asignación simples, de la forma a =
b. Después de la sentencia, sabemos que a y b tienen el mismo valor; por lo
tanto, podemos reemplazar las apariciones de a por las de b, y esperar que
al final a se convierta en un nombre “muerto” y que se pueda eliminar la
sentencia de copia (a = b ).

▸ 2. Eliminación de código “muerto”


Las proposiciones que definen un nombre que no se vuelve a utilizar, que
está “muerto”, pueden ser eliminadas. En general, las asignaciones
“muertas” aparecen como consecuencia de optimizaciones de propagación
de copias.

▸ 3. Optimizaciones aritméticas
Un buen grupo de optimizaciones de código se pueden obtener aplicando
transformaciones algebraicas simples que reduzcan el número de
operaciones o sustituyan operaciones costosas por otras más simples
equivalentes
9

3. Optimizaciones aritméticas

▸ 1. Cálculo previo de constantes: Cuando en una expresión


aparecen diferentes constantes, se pueden combinar en tiempo de
compilación para formar una sola.
▸ 2. Transformaciones algebraicas: Cuando en el código aparece
una identidad algebraica, se puede simplificar. Las
transformaciones más normales son las siguientes:

✓ suma: a + 0 = 0 + a = a
✓ resta: a - 0 = a
✓ multiplicación: a * 1 = 1 * a = a.
✓ división: a / 1 = a.
10

3. Optimizaciones aritméticas

▸ 4 . Reacomodamientos: Con las propiedades


asociativa y distributiva de las operaciones
se puede variar el código de las expresiones
aritméticas y reducir el número de nombres
involucrados en el cálculo.

▸ 5. Empaquetamientos temporales:
Normalmente, después de haber aplicado
una técnica para mejorar el código, se puede
reducir el número de nombres temporales
utilizados.
11

Optimización Dependiente de la Máquina

▸ Reasignar los registros de internos de la máquina adecuadamente.


▸ Usar operaciones especiales de la máquina para expresar
operaciones complejas.
▸ Utilizar los recursos y periféricos de la máquina más adecuados
para cada momento de ejecución.
12

Costos Optimización

▸ 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.
▸ Por ejemplo: for(int i=0; i< 10000; i++); si la
ganancia es de 30 ms 300s.
13

Costo de Ejecución Optimización

▸ En algunos programas se tiene un mínimo para ejecutar el programa,


por lo que el espacio y la velocidad de los microprocesadores .
▸ Las aplicaciones multimedios como los videojuegos tienen un costo de
ejecución alto por lo cual la optimización de su desempeño es crítica.
▸ Otro tipo de aplicaciones que deben optimizarse son las aplicaciones
para dispositivos móviles.
▸ Los dispositivos móviles tienen 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.
14

Criterios para Mejorar 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 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.
15

Ejemplo

OPTIMIZACIÓN PROPAGACIÓN DE
CÓDIGO INICIAL
ALGEBRAICA COPIA

a:= x**2
a:= x*x a:= x*x
b:=3
b:=3 b:=3
c:=x
c:=x c:=x
d:=c*c
d:=c*c d:=x*x
e:=b*2
e:=b+b e:=3+3
f:=a+d
f:=a+d f:=a+d
g:=e*f
g:=e*f g:=e*f
16

Ejemplo

ELIMINACIÓN DE SUB
REDUCCIÓN DE EXPRESIONES PROPAGACIÓN
CONSTANTES: COMUNES DE COPIAS

a:= x*x a:= x*x a:= x*x


b:=3 b:=3 b:=3
c:=x c:=x c:=x
d:=x*x d:=a d:=a
e:=6 e:=6 e:=6
f:=a+d f:=a+d f:=a+a
g:=e*f g:=e*f g:=6*f
17

Ejemplo
ELIMINACIÓN DE
CÓDIGO MUERTO

a:= x*x
f:=a+a
g:=6*f

Esta es la forma final


18

Gracias!

También podría gustarte