COMPILADORES E
INTERPRETES II
ING. FANCY SAPHIR AGUILAR BLANCO
OPTIMIZACIÓN DE CÓDIGO
Karol Abigail Colindres Villeda
Rosa Julia Solorzano Melgar
Anahí Benítez Aguilar
Lucero Michell Alvarado
Lesly Abigail Flores
Your paragraph text
INTRODUCCION
En términos generales, la
optimización de código puede
llevarse a cabo en varias etapas del
ciclo de desarrollo, desde el código
fuente escrito por los
programadores hasta el código
máquina generado por el
compilador. El objetivo principal de
la optimización es hacer que el
programa realice las mismas tareas,
pero de manera más eficiente.
En terminos generales podemos decir que es el proceso de ajustar o mejorar un sistema,
diseño, proceso o conjunto de parámetros para que funcione de la manera más eficiente
posible.
¿QUÉ ES LA OPTIMIZACIÓN?¿QUÉ ES LA OPTIMIZACIÓN?¿QUÉ ES LA OPTIMIZACIÓN?
En terminos orientados a la ingenieria podemos decir que es el proceso de mejorar la
eficiencia de un programa para que se ejecute más rápido, consuma menos recursos (como
memoria o energía) o ambos. El objetivo principal es reducir el tiempo de ejecución, el
uso de memoria o mejorar el rendimiento general sin alterar la funcionalidad o el
resultado esperado del programa.
Optimización de rendimiento (tiempo): Se busca reducir el tiempo de ejecución del
programa. Esto puede lograrse mejorando la eficiencia de los algoritmos,
eliminando redundancias, o aprovechando estructuras de datos más rápidas.
Optimización de memoria (espacio): Se enfoca en reducir el consumo de memoria,
utilizando estructuras de datos más eficientes, evitando copias innecesarias de
datos, y reutilizando recursos cuando sea posible.
Optimización del uso de energía: En dispositivos con recursos limitados, como
móviles o sistemas embebidos, es importante reducir el consumo de energía. Esto se
puede hacer minimizando el número de operaciones o mejorando la eficiencia del
hardware subyacente.
Tipos de optimización de código:
NIVELES DENIVELES DENIVELES DE
OPTIMIZACIÓNOPTIMIZACIÓNOPTIMIZACIÓN
Los niveles de optimización son configuraciones que determinan
cómo un compilador transforma el código fuente en código
máquina, buscando mejorar su rendimiento y eficiencia.Se
describen los niveles más comunes, especialmente en el
contexto del compilador GCC, que es ampliamente utilizado.
Optimización a nivel de compilador
Los compiladores modernos ofrecen varios niveles de
optimización que permiten mejorar el rendimiento del
código sin cambiar la lógica. Los niveles suelen
controlarse con opciones específicas (como -O1, -O2,
-O3 en GCC o Clang). Estos niveles permiten que el
compilador realice diversas transformaciones en el
código.
Nivel Descripcion
-00
Sin optimización: Este es el nivel por defecto. Se centra en la velocidad de compilación y facilita la
depuración, ya que no altera el código original.
-O1
Optimización básica: Se realizan algunas optimizaciones que no aumentan significativamente el tiempo de
compilación. Mejora el rendimiento sin complicar la depuración.
-02
Optimización moderada: Este nivel aplica una variedad más amplia de optimizaciones que pueden
aumentar el tiempo de compilación, pero mejora notablemente el rendimiento del código generado. Se
recomienda para compilaciones de lanzamiento.
-03
Optimización máxima: Incluye todas las optimizaciones de y añade otras más agresivas, como la
vectorización y la unificación de bucles. Este nivel puede aumentar considerablemente el tamaño del código
y no siempre es adecuado para aplicaciones donde la memoria es crítica.-O2
-0g
Optimización para depuración: Este nivel busca proporcionar un equilibrio entre la optimización y la
facilidad de depuración, permitiendo a los desarrolladores identificar errores sin sacrificar demasiado
rendimiento.
Niveles de optimización en compiladores (GCC/Clang)
TÉCNICAS COMUNES DETÉCNICAS COMUNES DETÉCNICAS COMUNES DE
OPTIMIZACIÓN DE CÓDIGOOPTIMIZACIÓN DE CÓDIGOOPTIMIZACIÓN DE CÓDIGO
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, es decir, usando menos recursos de cálculo
como memoria o tiempo de ejecución.
Es importante destacar las siguientes técnicas:
La optimización a nivel de compilador es
una serie de técnicas aplicadas por un
compilador para mejorar el rendimiento de
un programa durante su ejecución o reducir
el tamaño del código generado sin
modificar su funcionalidad.
OPTIMIZACIÓN A NIVEL DEOPTIMIZACIÓN A NIVEL DEOPTIMIZACIÓN A NIVEL DE
COMPILADORCOMPILADORCOMPILADOR
¿PARA QUÉ SIRVE LA OPTIMIZACIÓN A¿PARA QUÉ SIRVE LA OPTIMIZACIÓN A¿PARA QUÉ SIRVE LA OPTIMIZACIÓN A
NIVEL DE COMPILADOR?NIVEL DE COMPILADOR?NIVEL DE COMPILADOR?
Mejora del rendimiento: Las optimizaciones
permiten que los programas se ejecuten más
rápidamente
Reducción del uso de recursos: Algunas
optimizaciones están enfocadas en disminuir el
uso de memoria.
Reducción del tiempo de ejecución: Los
programas pueden ejecutarse de manera más
eficiente.
Mejora del uso del hardware: Las optimizaciones
ajustan el código para aprovechar mejor las
características del procesador
¿CÓMO SE USA LA OPTIMIZACIÓN A¿CÓMO SE USA LA OPTIMIZACIÓN A¿CÓMO SE USA LA OPTIMIZACIÓN A
NIVEL DE COMPILADOR?NIVEL DE COMPILADOR?NIVEL DE COMPILADOR?
Las optimizaciones a nivel de compilador
generalmente se configuran mediante opciones o
flags al compilar el programa. Dependiendo del
compilador que se utilice, existen diferentes formas
de activar estas optimizaciones como:
GNU (Compiler Collection)
Clang (LLVM)
Desafíos y Consideraciones en la OptimizaciónDesafíos y Consideraciones en la Optimización
1. Complejidad del problema
Desafío: A menudo, los problemas que se intentan optimizar son altamente complejos y de
múltiples variables, lo que puede dificultar la identificación de una solución óptima.
Consideración: Evaluar la dimensionalidad del problema y la factibilidad de reducirlo mediante
simplificaciones o aproximaciones es clave.
2. Balance entre calidad de la solución y tiempo de procesamiento
Desafío: A menudo existe un compromiso entre encontrar la mejor solución posible (óptimo
global) y el tiempo requerido para hacerlo.
Consideración: Determinar qué nivel de precisión es aceptable en función del costo
computacional y las restricciones de tiempo.
3. Manejo de restricciones
Desafío: Muchos problemas de optimización tienen restricciones que deben cumplirse (por
ejemplo, en la planificación de rutas o en la optimización de la cadena de suministro).
Consideración: Existen enfoques específicos para el tratamiento de restricciones, como los
métodos de penalización o los enfoques de programación entera o lineal, que deben
considerarse en función del tipo y cantidad de restricciones.
4. Superación de óptimos locales
Desafío: En muchos problemas no lineales, es común que los algoritmos de optimización
queden atrapados en óptimos locales en lugar de encontrar el óptimo global.
Consideración: Técnicas como el recocido simulado (simulated annealing), búsqueda por
enjambre de partículas o los algoritmos genéticos pueden ayudar a escapar de estos óptimos
locales.
5. Escalabilidad
Desafío: Lo que funciona para un problema de tamaño pequeño puede no escalar bien a
tamaños más grandes, lo que resulta en una explosión de complejidad y tiempos de cálculo
inaceptables.
Consideración: Desarrollar algoritmos eficientes que escalen bien y usar técnicas como la
paralelización o la optimización distribuida para abordar problemas más grandes de manera
efectiva.
6. Ambigüedad en la definición del problema
Desafío: A veces, el problema de optimización no está claramente definido o los objetivos son
contradictorios (por ejemplo, maximizar la calidad mientras se minimizan los costos).
Consideración: Definir claramente las funciones objetivo, sus pesos relativos (en el caso de
optimización multiobjetivo
7. Ruido e incertidumbre en los datos
Desafío: Los problemas de optimización a menudo se basan en datos que pueden estar sujetos
a ruido o incertidumbre.
Consideración: Incorporar modelos robustos que manejen el ruido en los datos, como la
optimización robusta o la optimización estocástica, para garantizar que las soluciones sean
viables frente a la incertidumbre.
8. Factores humanos y organizacionales
Desafío: Las soluciones óptimas desde el punto de vista matemático no siempre son aplicables
o aceptables en la práctica debido a consideraciones humanas, sociales o políticas dentro de
una organización.
Consideración: Es fundamental tener en cuenta el contexto organizacional y las limitaciones
operativas o culturales que pueden influir en la implementación de las soluciones.
CONCLUSIÓN
En conclusión, la optimización de código
es una práctica esencial para mejorar la
eficiencia de los programas.
Sin embargo, es importante reconocer
que la optimización debe realizarse de
manera estratégica y ya que optimizar
antes de lo adecuado puede hacer más
complejo el código lo que dificultaría el
mantenimiento y la lectura de este.