OPTIMIZACIÓN DE CÓDIGO

Documentos relacionados
Tema 2 Introducción a la Programación en C.

Todo programa en 'C' consta de una o más funciones, una de las cuales se llama main.

Unidad Didáctica 2. Elementos básicos del lenguaje Java Tipos, declaraciones, expresiones y asignaciones

Sistema electrónico digital (binario) que procesa datos siguiendo unas instrucciones almacenadas en su memoria

Métodos para escribir algoritmos: Diagramas de Flujo y pseudocódigo

Guía práctica de estudio 05: Diagramas de flujo

Expresiones Aritméticas. Programación digital I Escuela de Sistemas Facultad de Ingeniería Gilberto Diaz

Estructuras en LabVIEW.

Agradecimientos. Nota de los autores. 1 Problemas, algoritmos y programas 1

TECNICO SUPERIOR EN INFORMÁTICA EMPRESARIAL MÓDULO INTRUCCIONAL

Algoritmos. Medios de expresión de un algoritmo. Diagrama de flujo

Operadores de comparación

Programación Orientada a Objetos Sentencias Java Parte I Ing. Julio Ernesto Carreño Vargas MsC.

GENERACIÓN DE CÓDIGO

Diseño Estructurado de Algoritmos

Metodología para la solución de problemas programables

PROGRAMACIÓN. UNIDAD II. ALGORITMO PROFA : HAU MOY

Tabla de Símbolos. Programación II Margarita Álvarez

Java Avanzado Facultad de Ingeniería. Escuela de computación.

Capítulo 7 OPERADORES Y EXPRESIONES. Presentación resumen del libro: "EMPEZAR DE CERO A PROGRAMAR EN lenguaje C"

Expresiones y sentencias

Procesadores de lenguaje Tema 6 La tabla de símbolos

TEORÍA DE AUTÓMATAS Y LENGUAJES FORMALES TRABAJO DE PRÁCTICAS. Convocatoria de junio de 2013

Oliverio J. Santana Jaria. Sistemas Digitales Ingeniería Técnica en Informática de Sistemas Curso Los objetivos de este tema son:

Tema 2 Conceptos básicos de programación. Fundamentos de Informática

Herramientas de Programación. M.C. Juan Carlos Olivares Rojas

Elementos de un programa en C

CONJUNTOS NUMÉRICOS. La noción de número es tan antigua como el hombre mismo ya que son necesarios para resolver situaciones de la vida diaria.

Programación n Orientada a Objetos Sentencias Java Parte I. Ing. Julio Ernesto Carreño o Vargas MsC.

Procesamiento de documentos XML.

LENGUAJE. Tema 2 Elementos de un programa

TEMA 3: El proceso de compilación, del código fuente al código máquina

Algoritmos y solución de problemas. Fundamentos de Programación Otoño 2008 Mtro. Luis Eduardo Pérez Bernal

Principios de Computadoras II

ÁREA: MATEMÁTICAS UNIDAD : 1 TEMPORALIZACIÓN: OCTUBRE 1ª QUINCENA OBJETIVOS CONTENIDOS CRITERIOS DE EVALUACIÓN

ESCUELA POLITÉCNICA SUPERIOR PRÁCTICA 2: EXPRESIONES, PRINTF Y SCANF

TEMA 1. MATRICES, DETERMINANTES Y APLICACIÓN DE LOS DETERMINANTES. CONCEPTO DE MATRIZ. LA MATRIZ COMO EXPRESIÓN DE TABLAS Y GRAFOS.

GRAMATICAS LIBRES DEL CONTEXTO

Estructuras de Control

Expresiones algebraicas. Copyright 2013, 2009, 2006 Pearson Education, Inc. 1

Conferencia clase. Al desacoplar las ecuaciones se tiene. Sistemas de ecuaciones diferenciales lineales usando álgebra lineal

Carlos Montenegro. Programación Orientada a Objetos Proyecto Curricular de Ingeniería de Sistemas

ESTRUCTURAS REPETITIVAS EN PHP

Java para no Programadores

ÁLGEBRA DE BOOLE. 1.- Postulados de HUNTINGTON

Instrucciones de control

2.2 Nombres, Ligado y Ámbito

Java Avanzado. Guía 1. Java Avanzado Facultad de Ingeniería. Escuela de computación.

Tema 4. Operadores y Expresiones

TEMA 2. CONCEPTOS BÁSICOS DE ALGORÍTMICA

El lenguaje C. 1. Identificadores, constantes y variables

Operadores y Expresiones

Bases Matemáticas para la Educación Primaria. Guía de Estudio. Tema 3: Números racionales. Parte I: Fracciones y razones Números racionales

Principios de Computadoras II

XQuery. Un lenguaje de consulta para XML.

Introducción a la programación

Toda copia en PAPEL es un "Documento No Controlado" a excepción del original.

UNIDAD ACADÉMICA PROFESIONAL TIANGUISTENCO

: Algorítmica y Estructura de Datos I

Anexo. Control de errores

Computación II. Introducción a Visual Basic

Cristian Blanco

CPU MEMORIAS CACHE. Memorias caché. Memoria caché = memoria de tamaño pequeño y acceso rápido situada entre la CPU y la memoria principal.

ANÁLISIS SEMÁNTICO. Especificación formal: Semántica Operacional, semántica denotacional, semántica Axiomática, Gramáticas con Atributos.

Exterior del algoritmo. Entorno. Usuario. Procesador. Escribir. v1 v2 v3. Leer. <acción> {; <acción>}

GUIA 2: Repaso sobre uso de C#. Funciones, métodos y arreglos.

Programación en java. Estructuras algorítmicas

Estructuras de control

Estatutos de Control C# Estatutos de Decisión (Selección)

Estándares de Contenido y Desempeño, Estándares de Ejecución y Niveles de Logro Marcado* MATEMÁTICA

Objetos de aprendizaje: Computadora

Ficha de Aprendizaje N 13

1

Tema: Los Grafos y su importancia para la optimización de redes.

CICLOS DEL PROCESADOR

Programación Estructurada

TEMA 4. ESTRUCTURAS DE CONTROL

INTRODUCCIÓN AL PARADIGMA DE LA PROGRAMACIÓN ORIENTADA A OBJETOS CON JAVA

Expresiones Algebraicas en los Números Reales

Ruta más Corta con una sóla Fuente de Inicio (Single-Source Shortest Paths) DR. JESÚS A. GONZÁLEZ BERNAL CIENCIAS COMPUTACIONALES INAOE

LABORATORIO 3 ESTRUCTURAS REPETITIVAS WHILE / DO WHILE

DESCRIPCIÓN ESPECÍFICA NÚCLEO: Núcleo Sector Comercio y Servicios.

Funciones como Subprogramas en C++

TEMA 1.- POLINOMIOS Y FRACCIONES ALGEBRAICAS

INTRODUCCIóN A LA PROGRAMACIóN APUNTES DE JAVA APUNTES DE JAVA

GUÍA BÁSICA DE SCHEME v.4

ECUACIONES.

Tema 2. El lenguaje JAVA

Vamos a profundizar un poco sobre los distintos tipos de datos que podemos introducir en las celdas de una hoja de cálculo

La eficiencia de los programas

Formato para prácticas de laboratorio

Programación. Tema 8: Tablas Hash. Apuntes elaborados por: Eduardo Quevedo, Aaron Asencio y Raquel López Revisado por: Javier Miranda el????

OPERADORES Y EXPRESIONES

Novell. Novell Teaming 1.0. novdocx (es) 6 April 2007 EXPLORAR EL PORTLET DE BIENVENIDA DESPLAZARSE CON NOVELL TEAMING NAVIGATOR.

Álgebra Booleana y Simplificación Lógica

Algoritmos y Programas

Transcripción:

OPTIMIZACIÓN DE CÓDIGO INTRODUCCION La finalidad de la optimización de código es producir un código objeto lo más eficiente posible. En algunos casos también se realiza una optimización del código intermedio. Algunas optimizaciones que se pueden realizar son la evaluación de expresiones constantes, el uso de ciertas propiedades de los operadores, tales como la asociativa, conmutativa, y distributiva; así como la reducción de expresiones comunes. OBJETIVO Obtener código que se ejecuta más eficientemente según los criterios o Tiempo de ejecución (optimización temporal) o Espacio de memoria utilizado (optimización espacial) FUNCIONAMIENTO Revisa el código generado a varios niveles de abstracción y realiza las optimizaciones aplicables al nivel de abstracción. o Representaciones de código intermedio de más a menos abstractas. Árbol sintáctico abstracto: optimizar subexpresiones redundantes, reducción de frecuencia, etc. Tuplas o cuádruplas: optimizar en uso de los registros o de las variables temporales. Ensamblador/Código máquina: convertir saltos a saltos cortos, reordenar instrucciones. Representaciones de código para extraer información: grafos. CONDICIONES QUE SE HAN 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 Docente: Ing. Mirko Manrique Ronceros ~ 1 ~

o Si no se ha definido el orden de evaluación de los operandos la siguiente optimización es válida. B = 2*A + (A = c*d); Pasar a A = c*d; B = A*3; OPTIMIZACIÓN LOCAL Las optimizaciones locales se realizan sobre el bloque básico. Optimizaciones locales. o Folding o Propagación de constantes. o Reducción de potencia. o Reducción de subexpresiones comunes. BLOQUE BÁSICO Un bloque básico es un fragmento de código que tiene una única entrada y salida, y cuyas instrucciones se ejecutan secuencialmente. Implicaciones: o Si se ejecuta una instrucción del bloque se ejecutan todas en un orden conocido en tiempo de compilación. La idea del bloque básico es encontrar partes del programa cuyo análisis necesario para la optimización sea lo más simple posible. Bloque Básico (ejemplo) Ejemplos (separación errónea): Docente: Ing. Mirko Manrique Ronceros ~ 2 ~

Separación correcta for (i=1;i<10;++i) { b=b+a[i]; c=b*i; } a=3; b=4; goto l1; c=10; l1: d=3; e=4; ENSAMBLAMIENTO (FOLDING) El ensamblamiento es remplazar las expresiones por su resultado cuando se pueden evaluar en tiempo de compilación (resultado constante). o Ejemplo: A=2+3+A+C -> A=5+A+C Estas optimizaciones permiten que el programador utilice cálculos entre constantes representados explícitamente sin introducir ineficiencias. Implementación del Folding Implementación del floding durante la generación de código realizada conjuntamente con el análisis sintáctico. o Se añade el atributo de constante temporal a los símbolos no terminales y a las variables de la tabla de símbolos. o Se añade el procesamiento de las constantes a las reglas de análisis de expresiones. o Optimiza: 2+3+b -> 5+b Hay una suma de constantes (2+3)+b o No optimiza: 2+b+3 -> 2+b+3 No hay una suma de constantes (2+b)+3 Docente: Ing. Mirko Manrique Ronceros ~ 3 ~

Implementación posterior a la generación de código. o Buscar partes del árbol donde se puede aplicar la propiedad conmutativa: Sumas/restas: como la resta no es conmutativa se transforma en sumas: a + b c + d -> a + b + ( -c ) + d Productos/divisiones: como la división no es conmutativa se transforma en productos: a * b / c * e -> a * b * ( 1 / c ) * e o Buscar las constantes y operarlas. o Reconstruir el árbol PROPAGACIÓN DE CONSTANTES Desde que se asigna a una variable un valor constante hasta la siguiente asignación, se considera a la variable equivalente a la constante. Ejemplo: Propagación Ensamblamiento: PI=3.14 -> PI=3.14 -> PI=3.14 G2R=PI/180 -> G2R=3.14/180 -> G2R=0.017 PI y G2R se consideran constantes hasta la próxima asignación. Estas optimizaciones permiten que el programador utilice variables como constantes sin introducir ineficiencias. Por ejemplo en C no hay constantes y será lo mismo utilizar: Int a=10; #define a 10 Con la ventaja que la variable puede ser local. Actualmente en C se puede definir const int a=10; REDUCCIÓN DE POTENCIA(STRENGTH REDUCTION) Se busca sustituir operaciones costosas por otras más simples. Ejemplo: o Sustituir productos por sumas. a = 2 * a a = a + a o Evitar la operación append (++) a = length(s1 ++ s2) convertirlo en a = length(s1) + length(s2) Docente: Ing. Mirko Manrique Ronceros ~ 4 ~

ELIMINACIÓN DE SUBEXPRESIONES REDUNDANTES Las subexpresiones que aparecen más de una vez se calculan una sola vez y se reutiliza el resultado. Idea: Detectar las subexpresiones iguales y que las compartan diversas ramas del árbol. Problema: Hay que trabajar con un grafo acíclico. Dos expresiones pueden ser equivalentes y no escribirse de la misma forma A+B es equivalente a B+A. Para comparar dos expresiones se utiliza la forma normal o Se ordenan los operandos: Primero las constantes, después variables ordenadas alfabéticamente, las variables indexadas y las subexpresiones. Ejemplo X = C + 3 + A + 5 -> X = 3 + 5 + A + C Y = 2 + A + 4 + C -> Y = 2 + 4 + A + C o Divisiones y restas se ponen como sumas y productos para poder conmutar - A - B -> A + ( - B ) - A / B -> A * ( 1 / B ) Implementación Primero se aplica el folding y la propagación de constantes ( simplificar las expresiones ) Después se reordena el árbol sintáctico hasta obtener la forma normal. Se inicia la eliminación de las subexpresiones redundantes. Hay que considerar las asignaciones que pueden convertir una subexpresion redundante en no redundante. Ejemplo: Sustituir todas las variables asignadas por la expresión que se les ha asignado o Generar un orden de ejecución. o Sustituir siguiendo este orden de ejecución. Comparar los subárboles desde las ramas hacia la raíz y sustituir los subárboles repetidos. Docente: Ing. Mirko Manrique Ronceros ~ 5 ~

Recorrer el grafo acíclico generado y sustituir la primera aparición de cada rama que sea hijo de dos o más nodos por una asignación a una variable local y las otras ramas por la variable local. OPTIMIZACIONES DENTRO DE BUCLES La optimización de bucles es muy importante por las mejoras en tiempo de ejecución que se obtienen. Estrategias de optimización dentro de bucles o Expansión de bucles (loop unrolling) o Reducción de frecuencia (frequency reduction). o Reducción de potencia (strength reduction) Expansión de bucles (loop unrolling) La expansión de bucles solo se puede aplicar a los bucles cuyo número de iteraciones se conoce en tiempo de compilación. Ejemplo: o Se puede aplicar a los bucles for i=1 to 10 do o No se puede aplicar a los bucles for i=a to b do La expansión de un bucle puede ser muy costosa en espacio. Hay que poner un criterio heurístico para decidir si se aplica la expansión. o Se puede aplicar una expansión parcial en la que sigue existiendo el bucle, pero cada iteración del nuevo bucle corresponde a varias iteraciones del bucle original. En un bucle expandido se ha de sustituir el índice del bucle por el valor constante correspondiente. Reducción de frecuencia (frequency reduction) La reducción de frecuencia detecta las operaciones invariantes de bucle y las calcula una única vez delante del bucle. Ejemplo: for i = 1 to n do c = i * sin(a); o sin(a) es una operación invariante del bucle que puede pasar de calcularse n veces a una con la siguiente transformación tmp=sin(a); for i=1 to n do c=i*tmp; Docente: Ing. Mirko Manrique Ronceros ~ 6 ~

o Esta transformación no tiene en cuenta que el bucle igual no se ejecuta ninguna vez y esto supondría perder tiempo de ejecución calculando la invariante de bucle innecesariamente. Además el cálculo de la invariante puede producir un error de ejecución. Por ejemplo una división por cero. Reducción de frecuencia (frequency reduction) Las invariantes de bucle sólo pueden estar formadas por operaciones que son funciones puras. o Su único efecto es el cálculo del resultado. o El resultado solo depende de los operandos. Ejemplo: o Invariantes: +. -, *, /, sin, ln o No invariantes: printf, getchar, ++, random Consideración práctica. o Sólo pueden ser invariantes operaciones primitivas del lenguaje (son aquellas que implementa directamente el compilador). Ejemplo: operaciones aritméticas, comparaciones, etc. o Algunos compiladores permiten indicar que una función es pura para que pueda formar parte de invariantes. Reducción de potencia aplicada a bucles o Sustituir productos entre variables inductivas e invariantes de bucle por sumas for(i=1; i<10;++i) a[i]=3*i; convertir en for(i=1,j=3;i<10;++i,j+=3) a[i]=j; Problemas a resolver. Detectar las invariantes de bucle Ya está solucionado Detectar las variables inductivas OPTIMIZACIÓN GLOBAL Grafo del flujo de ejecución. o Antes de realizar una optimización global es necesario crear el grafo de flujo de ejecución. o El grafo de flujo de ejecución representa todos los caminos posibles de ejecución del programa. o La información contenida en el grafo es útil para El programador y El optimizador Docente: Ing. Mirko Manrique Ronceros ~ 7 ~

La optimización global a partir del análisis del grafo del flujo de ejecución permite. o Una propagación de constantes fuera del bloque básico. o Eliminación del código no utilizado o Una mejor asignación de los registros. o Etc. Problema: la optimización global es muy costosa en tiempo de compilación. DETECCIÓN DE CÓDIGO NO UTILIZADO (CÓDIGO MUERTO) Código muerto: es código que nunca se ejecutará. Detección de código no utilizado. o El código no utilizado son los bloques básicos donde no llega ninguna arista. o Se quita el bloque y las aristas que salen de él. o Repetir hasta no eliminar ningún bloque básico. APLICACIONES A LA OPTIMIZACIÓN DE PROGRAMAS Expresiones disponibles (al seguir la ejecución sigue siendo válido el resultado obtenido). o Eliminar expresiones redundantes Alcance de las definiciones. o Reutilizar las copias en registro de los valores de las variables. o Propagación de constantes. o Reducción de frecuencia Variables vivas o Reutilizar el espacio de variables. o Eliminar variables innecesarias. Expresiones muy utilizadas. o Optimizar la asignación de registros Docente: Ing. Mirko Manrique Ronceros ~ 8 ~