Optimizacion
Las optimizaciones pueden realizarse de diferentes formas. 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.
La optimización es un proceso que tiene a minimizar o maximizar alguna variable de rendimiento, generalmente tiempo, espacio, procesador, etc.
Tipos de optimización
Dentro de los tipos de optimización se derivan los tipos de
optimización local, optimización de ciclo, optimización global y optimización
de mirilla.
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.
La característica 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: E/S, la concurrencia, la rapidez y confiabilidad de un conjunto de instrucciones. Como el espacio de soluciones es más pequeño la optimización local es más rápida. Como el espacio de soluciones es más pequeño la optimización local es más rápida.
ejemplos:
- Folding
- Propagación de constantes
- Reducción de potencia.
- Reducción de subexpresiones comunes.
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.
En este caso es mejor pasar el Int c =a; fuera del ciclo de
ser posible. El problema de la optimización en ciclos y en general radica es
que muy difícil saber el uso exacto de algunas instrucciones. Así que no todo
código de proceso puede ser optimizado. Otros uso de la optimización pueden ser
el mejoramiento de consultas en SQL o en aplicaciones remotas (sockets, E/S,
etc.)
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.
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.
Funcionamiento
Revisa el código generado a varios niveles de abstracción y realiza las optimizaciones aplicables al nivel de abstracción
Representaciones de código para extraer información de grafos.
Condiciones que se deben de cumplir
El código optimizado se ha de comportar igual que el código de partida excepto por ser más rápido o ocupar menos espacio.
Hay que buscar transformaciones que no modifiquen el comportamiento del código según el comportamiento definido para el lenguaje de programación.
EJEMPLO
Si no se ha definido el orden de evaluación de los operandos la siguiente optimización es válida.
Objetivo
Obtener código que se ejecuta más eficientemente según los criterios
• Tiempo de ejecución (optimización temporal)
• Espacio de memoria utilizado(optimización espacial)
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.
Instrucciones de bifurcación Interrumpen el flujo normal de un programa, es
decir que evitan que se ejecute alguna instrucción del programa y salta a otra
parte del programa. Por ejemplo: el “break”
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
de los microprocesadores son elementos que se deben optimizar para tener un
mercado potencial más amplio. Las aplicaciones multimedia 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 video) o de mucha memoria. 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. 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.
Memoria
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.
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.
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 del mismo. El gestor de memoria del sistema operativo debe hacer de puente entre los requisitos de las aplicaciones y los mecanismos que proporciona el hardware de gestión de memoria.
Para que una variable pueda ser almacenada en memoria estática, es necesario conocer su tamaño (número de bytes necesarios para su almacenamiento) en tiempo de compilación. Como consecuencia, aunque una variable (u objeto) sea de ámbito global, no podrán ocupar almacenamiento estático: " Los objetos que correspondan a procedimientos o funciones recursivas, ya que en tiempo de compilación no se conoce el número de variables que serán necesarias. "
Registros
Tipos De Registros
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.
•Registros de Segmento
•Registros de Apuntador de Instrucciones
•Registros Apuntadores
•Registros de Propósito General
•Registros Índices
•Registros de Banderas
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.
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 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.
Existen 3 criterios para mejorar el código
- Asignación de registros
- Operaciones innecesarias
- Operaciones costosas
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.
- Un punto determinado mediante un punto de ruptura.
- Un punto determinado bajo ciertas condiciones mediante un punto de ruptura condicional.
- Un momento determinado cuando se cumplan ciertas condiciones.
- Un momento determinado a petición del usuario.
Comentarios
Publicar un comentario