OPTIMIZACION.
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.
3.1 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.
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.
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.
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.
3.2.1 costos 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 microprocesador son elementos que se deben optimizar para tener un mercado potencial más amplio.
Memoria
Servicios genéricos de memoria
Los registros del procesador se emplean para controlar instrucciones en ejecución, manejar direccionamiento de memoria y proporcionar capacidad aritmética. Los registros son espacios físicos dentro del microprocesador con capacidad de 4 bits hasta 64 bits dependiendo del microprocesador que se emplee. Los registros son direccionables por medio de una viñeta, que es una dirección de memoria. Los bits, por conveniencia, se numeran de derecha a izquierda (15,14,13…. 3,2,1,0), los registros están divididos en seis grupos los cuales tienen un fin especifico.
La pila
La aparición de lenguajes con estructura de bloque trajo consigo la necesidad de técnicas de alojamiento en memoria más flexibles, que pudieran adaptarse a las demandas de memoria durante la ejecución del programa.
En, en general los compiladores, la asignación de memoria de variables locales se hace de una forma flexible, atendiendo al hecho de que solamente necesitan memoria asignada desde el momento que comienza la ejecución de la función hasta el momento en que ésta finaliza.
La memoria es uno de los recursos más importantes de la computadora y, en consecuencia, la parte del sistema operativo responsable de tratar con este recurso, el gestor de memoria, es un componente básico. 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 microprocesador son elementos que se deben optimizar para tener un mercado potencial más amplio.
Algunos lenguajes de programación utilizar la pila para almacenar datos que son locales a espacio para los datos locales se asigna a los temas de la pila cuando el procedimiento se introduce, y son borradas cuando el procedimiento termina.
Organización de la memoria en tiempo de ejecución
Las técnicas de gestión de la memoria durante la ejecución del programa difieren de unos lenguajes de programación a otros, e incluso de unos compiladores a otros.
Para datos, básicamente la memoria se divide en:
- Memoria Estática.
- La Pila.
- (Heap El Monton).
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.
No hay comentarios.:
Publicar un comentario