4.1. Optimización de código - Equipo 4 PDF

Title 4.1. Optimización de código - Equipo 4
Author Kasandra Cañizo
Course Programación
Institution Instituto Tecnológico de Pachuca
Pages 14
File Size 379.7 KB
File Type PDF
Total Downloads 109
Total Views 136

Summary

Resúmen...


Description

1

Instituto Tecnológico de Pachuca, Campus Pachuca Ingeniería Química

4.1. OPTIMIZACIÓN DE CÓDIGO

IQC-1018: Programación Ing. Miguel A. Acosta

Equipo 4 Kasandra Cañizo, Angélica M. Flores, Luis A. Hernández, Miriam I. Martínez y Alejandro Pérez 15 de abril de 2021

2 Tabla de contenido Introducción ........................................................................................................................... 3 Marco teórico ......................................................................................................................... 5 Historia de la optimización del código .......................................................................... 5 Definición e importancia .............................................................................................. 5 Técnicas de optimización (dependientes e independientes) ......................................... 6 Optimización locales y globales .................................................................................. 6 Optimización y sus derivados ...................................................................................... 7 Reordenación del código ............................................................................................. 8 Reordenación de operaciones ..................................................................................... 10 Optimización de bucles ............................................................................................... 10 Reducción de fuerzas de una operación ...................................................................... 10 Optimización de flujo ................................................................................................... 11 Conclusión ............................................................................................................................. 12 Actividad................................................................................................................................. 13 Referencias ............................................................................................................................ 14

3 Optimización de código Introducción En las primeras generaciones de la programación, los lenguajes debían ser exigentemente muy próximos a la plataforma de ejecución. En ese entonces, el código máquina o el lenguaje ensamblador ofrecían un control del proceso de ejecución, desde cómo se asignan los registros del procesador hasta cómo se almacenan los datos y se accede a la memoria. De este modo, era posible obtener la máxima eficiencia de una plataforma. Sin embargo, las desventajas que se presentaban eran la falta de portabilidad y el mayor coste de desarrollo y mantenimiento del código. Actualmente existen los lenguajes de programación de alto nivel, que nos permiten ser más productivos resolviendo problemas más complejos en menos tiempo. Idealmente, los compiladores deberían producir un código objeto perfecto, pero esto es difícil de conseguir y muy pocas veces se alcanza esa meta. Sin embargo, el código generado por el compilador puede ser mejorado por medio de unas transformaciones que se han denominado tradicionalmente optimizaciones. La optimización de código (figura 1), 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 (usando menos recursos de cálculo como memoria o tiempo de ejecución).

Figura 1 Representación de optimización de código

La optimización de código es importante en el desarrollo de una aplicación ya que proporciona mejoras para su ejecución. Su objetivo es maximizar la eficiencia temporal y espacial

4 de los programas permitiendo reorganizar el código de manera limpia, correcta y eficiente, Las distintas técnicas de optimización se pueden clasificar en dos formas diferentes: las dependientes de la máquina y las independientes de la máquina; las locales y las globales. Las técnicas dependientes de la máquina son aquellas que sólo se pueden aplicar a una determinada máquina objeto, como se muestra en el ejemplo de la figura 2. Por otro lado, las independientes de la máquina son aplicables a cualquier máquina objeto (figura 3).

Figura 2 Ejemplo de técnica dependiente de la máquina

Figura 3 Ejemplo de técnica independiente de la máquina

Por otra parte, las técnicas de optimización se dividen también en locales y globales (figura 4). Las técnicas de optimización locales analizarán sólo pequeñas porciones de código y en ellas realizarán mejoras, mientras que para la aplicación de las técnicas globales será necesario el análisis de todo el código.

Figura 4 Optimización local y global

Cada optimización está basada en una función de coste y en una transformación. Con la función de coste se evalúa la mejora obtenida con la optimización, considerando como criterios más comunes el ahorro en el tamaño del código, la reducción del tiempo de ejecución y la mejora de las necesidades del espacio para los datos del programa. Mientras que las transformaciones se encargan del logro de dichas mejoras preservando el comportamiento del programa.

5 Para para obtener un buen programa se debe elegir el algoritmo más eficiente. Así, una vez implementado el mejor algoritmo, se puede optimizar el código obtenido a partir de él para mejorar el rendimiento del programa. Historia de la optimización del código En las primeras generaciones de la programación, los lenguajes debían ser exigentemente muy próximos a la plataforma de ejecución. En ese entonces, el código máquina o el lenguaje ensamblador ofrecían un control del proceso de ejecución, desde cómo se asignan los registros del procesador hasta cómo se almacenan los datos y se accede a la memoria. De este modo, era posible obtener la máxima eficiencia de una plataforma. Sin embargo, las desventajas que se presentaban eran la falta de portabilidad y el mayor coste de desarrollo y mantenimiento del código. Actualmente existen los lenguajes de programación de alto nivel, que nos permiten ser más productivos resolviendo problemas más complejos en menos tiempo. Idealmente, los compiladores deberían producir un código objeto perfecto, pero esto es difícil de conseguir y muy pocas veces se alcanza esa meta. Sin embargo, el código generado por el compilador puede ser mejorado por medio de unas transformaciones que se han denominado tradicionalmente optimizaciones. Definición e importancia 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 (usando menos recursos de cálculo como memoria o tiempo de ejecución). La optimización de código es importante en el desarrollo de una aplicación ya que proporciona mejoras para su ejecución. Su objetivo es maximizar la eficiencia temporal y espacial de los programas permitiendo reorganizar el código de manera limpia, correcta y eficiente.

6 Técnicas de optimización (dependiente e independientes) Las distintas técnicas de optimización se pueden clasificar en dos formas diferentes: las dependientes de la máquina y las independientes de la máquina; las locales y las globales. Las técnicas dependientes de la máquina son aquellas que sólo se pueden aplicar a una determinada máquina objeto. Por otro lado, las independientes de la máquina son aplicables a cualquier máquina objeto. Optimizaciones locales y globales Por otra parte, las técnicas de optimización se dividen también en locales y globales. Las técnicas de optimización locales analizarán sólo pequeñas porciones de código y en ellas realizarán mejoras, mientras que para la aplicación de las técnicas globales será necesario el análisis de todo el código. Cada optimización está basada en una función de coste y en una transformación. Con la función de coste se evalúa la mejora obtenida con la optimización, considerando como criterios más comunes el ahorro en el tamaño del código, la reducción del tiempo de ejecución y la mejora de las necesidades del espacio para los datos del programa. Mientras que las transformaciones se encargan del logro de dichas mejoras preservando el comportamiento del programa. Para para obtener un buen programa se debe elegir el algoritmo más eficiente. Así, una vez implementado el mejor algoritmo, se puede optimizar el código obtenido a partir de él para mejorar el rendimiento del programa. Para la optimización de un código es necesario revisar que sea a partir de los 2000 en adelante para saber el cambio de procesos de optimización en base a los avances tecnológicos actuales.

7 Optimización y sus derivados La optimización es un programa de transformación técnica, que trata de mejorar el código por lo que consumen menos recursos (lo que se interpreta como CPU y memoria) y ofrecer una alta velocidad. En la optimización de alto nivel general de programación, son sustituidos por constructores muy eficiente de bajo nivel de los códigos de programación. Un código en fase de proceso o de optimización debe seguir las tres normas que se explican a continuación: •

El código salida no debe de cambiar de ninguna o sentido del programa,



La optimización debe aumentar la velocidad del programa y si es posible, el programa debe exigir menos cantidad de recursos.



La optimización debe ser rápida y no debe retrasar el proceso de compilación general.

Los esfuerzos para un código optimizado pueden ser utilizados en los distintos niveles de elaboración del proceso, al principio, los usuarios pueden cambiar o reorganizar el código o utilizar los mejores algoritmos para escribir el código. Ya después de generar el código intermedio, el compilador puede modificar el código intermedio por dirección de los cálculos y mejorar los lazos. Al tiempo que se produce la máquina de destino código y el compilador puede hacer uso de jerarquía de memoria y registros de la CPU. La optimización puede clasificarse en dos grandes categorías: •

Independiente de la máquina. o

Ejecución en tiempo de compilación.

o

Eliminación de redundancias.

o

Cambio de orden.

o

Reducción de frecuencia de ejecución (invariancias).

o

Reducción de fuerza.

8



Dependiente de la máquina. o

Asignación de registros.

o

Instrucciones especiales ("idioms").

o

Reordenación del código.

Instrucciones especiales ("idioms"). Algunas máquinas tienen instrucciones especiales que permiten acelerar ciertos procesos. Por ejemplo: •

TRT en IBM 390 y XLAT en INTEL: Permiten realizar una codificación en una sola instrucción máquina.



MOV en IBM 370: Permite copiar bloques de memoria de hasta 255 caracteres.



REP en INTEL: Permite copiar, llenar o comparar bloques de memoria utilizando como registros índices SI y DI.



TEST en INTEL: Permite realizar fácilmente varias comparaciones booleanas.

Ejemplo: if (x&4 || x&8) ... se puede representar: TEST X,12 JZ L ... L:

Reordenación del código En muchas máquinas, la multiplicación en punto fijo de dos operandos de longitud 1 da un operando de longitud 2, mientras la división necesita un operando de longitud 2 y otro de longitud 1 para dar un cociente y un resto de longitud 1. Lo cual la reordenar las operaciones puede optimizar. Por ejemplo: sea la expresión a=b/c*d;

9 MOV AX,B XOR DX,DX DIV AX,C MUL AX,D MOV A,AX Si la reordenamos así: a=b*d/c; aprovechando que la multiplicación y la división son asociativas, se obtiene: MOV AX,B MUL AX,D DIV AX,C MOV A,AX Ahorramos una instrucción. Veamos otro ejemplo: a=b/c; d=b%c; Los dos códigos siguientes son equivalentes. Puede tratarse como un caso particular del manejo de registros. La realización de la primera división debería guardar constancia de que DX contiene el resultado del resto. MOV AX,B

MOV AX,B

XOR DX,DX

XOR DX,DX

DIV AX,C

DIV AX,C

MOV A,AX

MOV A,AX

MOV AX,B

MOV D,DX

XOR DX,DX DIV AX,C MOV D,DX Ejecución en tiempo de compilación

10 Ejemplo: int i; float f; i = 2+3;

(+,2,3,t1)

(=,5,,i)

(=,t1,,i) i = 4;

(=,4,,i)

(=,4,,i)

f = i+2.5; (CIF,i,,t2)

(=,6.5,,f)

(+,t2,2.5,t3)

(=,t3,,f)

La ejecución se aplica principalmente a las operaciones aritméticas (+-*/) y a las conversiones de tipo.

Reordenación de operaciones Tener en cuenta la conmutatividad de algunas operaciones puede mejorar el proceso, pues las cuádruplas (*,a,b,-) y (*,b,a,-) serían equivalentes. Para facilitar el reconocimiento, se puede adoptar un orden canónico para los operandos de las operaciones conmutativas. Optimización de bucles Una operación es invariante respecto a un bucle, si ninguno de los operandos de los que depende cambia de valor durante la ejecución del bucle. La optimización consiste en sacar la operación fuera del bucle.

Reducción de la fuerza de una operación Es importante la optimización de un código, porque trata de mejorar el código por lo que consumen recursos de la memoria y CPU, al igual trata de ofrecer una alta velocidad. De la cual se garantiza con la optimización que el código de salida debe aumentar la velocidad del programa

11 y si es posible el programa debe exigir menos cantidad de recursos. Los aspectos que se tienen que considerar parar hacer una optimización, de lo cual se consideran los dos bloques que no tienen instrucciones de salto entre ellos. Por ejemplo: cuando la primera se ejecuta la instrucción, todas las instrucciones en el mismo bloqueo básico será ejecutado en secuencia de apariencia sin perder el control de flujo del programa. Igual una de las cosas fundamentales para garantizar que el código no será menos eficiente que antes de optimizarlo. Por ejemplo, el desenrollado de bucles (loop unrolling, replicar N veces el código de un bucle) puede reducir el tiempo de ejecución al simplificar instrucciones innecesarias, aunque al hacerlo puede crecer el tamaño del código. Dado a que el tamaño del código puede llegar a tener consecuencias a un nivel de acceso a cache y a la memoria le podría pasar que el programa optimizado acabara siendo más lento que el original. Hay diferentes técnicas con las cuales son para optimizar el código, cada una de las cuales intentan mejorar un aspecto diferencia del código. En general pueden clasificarse en dos categorías: •

Las de flujo de datos (data-flow)



Las de flujo de control (control-flow)

Optimización del flujo Las optimizaciones del flujo de datos pretenden mejorar la eficiencia de los diferentes cálculos realizados en el programa: recalculando expresiones con valor conocido en tiempo de compilación, reaprovechando cálculos ya realizados en otras partes del código o suprimiendo cálculos innecesarios. Pero, por lo contrario, las optimizaciones del flujo de control intentan utilizar las instrucciones de salto condicional e incondicional de la forma más eficiente posible, ya sea

12 desplazando el código o eliminando saltos innecesarios. También se puede definir una tercera categoría, las optimizaciones de bucles (loop optimization), intentan manejar el rendimiento de las instrucciones iterativas como for, While, do o repeat y until. En este caso los cambios realizados al código del bucle le afectan tanto al flujo de datos como al flujo de control.

Conclusión La optimización de un código; se determina a partir del 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. Una optimización es un programa de transformación técnica, que trata de mejorar el código por lo que consumen menos recursos, y ofrecer una alta velocidad. Para la optimización de un código es necesario revisar que sea a partir de los 2000 en adelante para saber el cambio de procesos de optimización en base a los avances tecnológicos actuales. Para un código optimizado pueden ser utilizados en los distintos niveles de elaboración del proceso, al principio, los usuarios pueden cambiar o reorganizar el código o utilizar los mejores algoritmos para escribir el código. Las optimizaciones del flujo de datos pretenden mejorar la eficiencia de los diferentes cálculos realizados en el programa: recalculando expresiones con valor conocido en tiempo de compilación, reaprovechando cálculos ya realizados en otras partes del código o suprimiendo cálculos innecesarios. Es importante la optimización de un código, porque trata de mejorar el código por lo que consumen recursos de la memoria y CPU, al igual trata de ofrecer una alta velocidad; con el propósito de lograr un equilibrio entre una velocidad de ejecución rápida y un tamaño de código reducido.

13 Actividad Con base a la información proporcionada anteriormente responde el siguiente cuestionario.

1. ¿Qué es la optimización de un código? 2. ¿Qué normas debe seguir un código en frase de proceso? 3. ¿Cómo se clasifica la optimización? 4. ¿Qué la optimización de bucles? 5. Menciona algunas técnicas para optimizar un código. 6. ¿Cuál es la tercera categoría de la optimización de un bucle?

14 Referencias

Cairó. O., (2006). Fundamentos de programación: piensa en C (1a ed.). Pearson Educación https://dokumen.pub/fundamentos-de-programacion-piensa-en-c-97026081049789702608103.html Aguilar,

L.

J.

(2008).

Fundamentos

de

programación

(4

ed.).

Mc

Graw

Hill.

https://combomix.net/wp-content/uploads/2017/03/Fundamentos-deprogramaci%C3%B3n-4ta-Edici%C3%B3n-Luis-Joyanes-Aguilar-2.pdf Vázquez, J. (2012). Análisis y diseño de algoritmos. (1ª ed.). RED TERCER MILENIO. http://www.aliat.org.mx/BibliotecasDigitales/sistemas/Analisis_y_disenio_de_algoritmos. pdf Ramírez, F. (2007). Introducción a la Programación. Algoritmos y su implementación en Visual Basic. NET, C#, Java y C++. (2ª ed.). Alfaomega. Márquez F., Teresa G.; Osorio Á., Olvera P., & Elzie N. (2011). Introducción a la programación estructurada en C. (1ª ed.). Pearson Educación. Manrique, M. (2018). OPTIMIZACIÓN DE CÓDIGO. Universidad Nacional del Santa. Recuperado

de

https://nanopdf.com/download/optimizacion-de-codigo-introduccion-

objetivo-funcionamiento_pdf Rendón,

A.

(2015).

Optimización

de

Código.

EcuRed.

Recuperado

de

https://www.ecured.cu/Optimizaci%C3%B3n_de_C%C3%B3digo Clarisó, R. (2016). Optimización de código: un código más eficiente. Universitat Oberta de Catalunya. Recuperado de https://informatica.blogs.uoc.edu/optimizacion-de-codigo-uncodigo-mas-eficiente/ Aho, A.V. (2000). Generación de código intermedio. Optimización. [Archivo PDF]. Disponible en http://informatica.uv.es/docencia/iiguia/asignatu/2000/PL/2008/tema7.pdf...


Similar Free PDFs