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)

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.

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”

Costos 
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.
Pero en cambio si esa optimización se hace por ejemplo en un ciclo, la mejora obtenida puede ser N veces mayor por lo cual el costo se minimiza y es benéfico la mejora. 

Por ejemplo: 

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

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

Resultado de imagen para espacio de 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

Resultado de imagen para 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.


Algunos ejemplos de registros son:

•Registros de Segmento
•Registros de Apuntador de Instrucciones
•Registros Apuntadores
•Registros de Propósito General
•Registros Índices
•Registros de Banderas


La pila
Resultado de imagen para almacenar datos en pilas


La forma más sencilla de almacenar el contenido de una variable en memoria, en tiempo de ejecución, es hacerlo en la memoria estática. Así, el almacenamiento de dichas variables será permanente (durante la ejecución del programa). Por ello, resulta obvio que los datos etiquetados como constantes y las variables globales de un programa tengan asignada la memoria necesaria durante toda la ejecución del programa. Sin embargo, no todas las variables pueden almacenarse estéticamente.

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
un registro es una memoria de alta velocidad y poca capacidad, integrada en el microprocesador, que permite guardar transitoriamente y acceder valores muy usados, generalmente en operaciones matemáticas 
Cuáles son las ventajas de la digitalización documental? - Artero

  • Operaciones innecesarias
Las operaciones innecesarias surgen a menudo por un desempeño inadecuado de la operación anterior. Debe utilizarse una segunda operación para "corregir" o dejar aceptable el trabajo de la primera
Análisis de operaciones.Fase 1.enfoque de la finalidad de la operación
  • Operaciones costosas 

En algunos casos la realización de algunas operaciones suelen tener un costo de ejecución elevado, y en ocasiones estas operaciones pueden cambiarse por otros métodos de producción que podrían ser mas complejos si es la primera vez que se realiza pero a lo largo estos métodos terminan por ser beneficiosos trayendo consigo ganancias al a hora de ejecutar las operaciones

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.

Depurador.

Es una aplicación que permite correr otros programas, permitiendo al usuario ejercer cierto control sobre los mismos a medida que los estos se ejecutan, y examinar el estado del sistema (variables, registros, banderas, etc.) en el momento en que se presente algún problema.
El depurador permite detener el programa en:
  • 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.
Durante esa interrupción, el usuario puede:
·         Examinar y modificar la memoria y las variables del programa.
·         Examinar el contenido de los registros del procesador.
·         Cambiar el punto de ejecución, de manera que el programa continúe su ejecución en un punto diferente al punto en el que fue detenido.
·         Ejecutar instrucción a instrucción.
·         Ejecutar partes determinadas del código, como el interior de una función, o el resto de código antes de salir de una función.
Desamblador o desensamblador.

Es un programa de computadora que traduce el lenguaje de máquina a lenguaje ensamblador, la operación inversa de la que hace el ensamblador.

Un desensamblador se diferencia de un decompilador, en que está dirigido a un lenguaje de alto nivel en vez de al lenguaje ensamblador.

Usos
Son ampliamente utilizados para crackear programas y para realizar ingeniería inversa. También son utilizados por desarrolladores de software, investigadores o estudiantes.

Ejemplos
♫ Interactive Disassembler es el más comúnmente utilizado.
♫ ILDASM es una herramienta contenida en el SDK del .NET Framework.
♫ OllyDbg es un desensamblador integrado para Lenguaje Ensamblador y COBOL.
♫ Texe es un desensamblador que corre a 32 bits y además un analizador de archivos PE (Portable Executable )de Windows libre.

Diagrama de flujo de datos.

Es una herramienta de modelización que permite describir, de un sistema, la transformación de entradas en salidas. El DFD también es conocido con el nombre de Modelo de Procesos de Negocios.

Ejemplo

Diccionario de datos.
El diccionario de datos es un listado organizado de todos los elementos de datos que son pertinentes para el sistema, con definiciones precisas y rigurosas que le permite al usuario y al proyectista del sistema tener una misma comprensión de las entradas, de las salidas, y también de cálculos intermedios.
Ejemplo







Comentarios

Entradas populares