¿Qué es la optimización del programa?

La optimización del programa es el proceso de modificar un programa de computadora de una manera que hace que el programa se ejecute más rápido, consuma menos recursos o, en general, funcione con un mayor nivel de eficiencia. La tarea de optimización puede ser realizada automáticamente por algunos compiladores de lenguajes de programación, intencionalmente mediante el uso de un programa de optimización, o manualmente por programadores que recorren el código fuente e intentan realizar mejoras específicas. En general, la optimización del programa se realiza con un fin específico en mente, porque hay muy pocas optimizaciones generales que se pueden hacer en un programa que no reducen de alguna manera el estado optimizado de otra parte del programa, lo que significa que un programa generalmente puede optimizarse para la velocidad o el uso de recursos, pero normalmente no para ambos. Una complicación que puede ocurrir con algunos tipos de optimización es que muchos lenguajes de programación de alto nivel proporcionan un nivel de abstracción tan grande entre el código nativo y el lenguaje de computadora que la optimización puede ser difícil o imposible de implementar en todas las plataformas en todas las situaciones, especialmente con lenguajes interpretados que utilizan compilación Just-In-Time (JIT).

Un concepto importante en la optimización de programas es la idea de que una optimización suele tener algún tipo de precio. Un ejemplo de esto es que, cuando un fragmento de código se optimiza para que se ejecute más rápidamente, el aumento de la velocidad podría tener el precio de la legibilidad del código, el uso de la memoria, la flexibilidad del programa u otros costos. Esto significa que la optimización del programa debe ser un proceso focalizado, con la intención de hacer que un aspecto de un programa funcione de mejor manera y al mismo tiempo estar dispuesto a sacrificar la eficiencia de otros aspectos.

Se pueden realizar diferentes tipos de optimización de programas en diferentes etapas del desarrollo del programa. Durante el diseño, se puede realizar una amplia optimización asegurándose de que un programa parezca ejecutarse de manera efectiva. Cuando se trabaja con código fuente real, las optimizaciones pueden incluir garantizar que no haya comandos extraños, llamadas repetitivas o funciones mal escritas. En la compilación, el compilador realiza automáticamente muchas optimizaciones y el programador puede guiarlas mediante el uso de diferentes modificadores o directivas del compilador.

Las optimizaciones automáticas, como puede ocurrir con un compilador o un programa de optimización de dedicación, a menudo pueden involucrar trucos que son demasiado complejos para ser prácticos para programadores humanos. Esto puede implicar mover instrucciones en un programa para que se ejecuten fuera del orden escrito originalmente, pero de una manera más eficiente para el procesador. También puede implicar el cambio intencional de recursos, como bloques de memoria, para que se pueda acceder a ellos más rápido. La mayor parte de la optimización de programas se produce automáticamente a nivel del compilador.

Una complicación con la optimización de programas repetida o agresiva es que, una vez que un programa se ha modificado para que se ejecute de manera más eficiente, generalmente se vuelve más difícil de modificar para otros fines, como agregar funcionalidad o corregir errores. Esto puede ocurrir cuando las optimizaciones comienzan a bloquear los comportamientos del programa establecido que no se cambian o adaptan fácilmente al nuevo código sin requerir que se deshagan todas las optimizaciones. Un problema mayor es que, en muchos casos, un programa optimizado se vuelve menos legible por humanos, porque se utilizan trucos y atajos en lugar de solo comandos concisos y estructuras de control clásicas. Por estas razones, a menudo existe un nivel de optimización del programa en el que es aceptable detenerse, aunque las modificaciones drásticas del código pueden hacer que un programa funcione de manera ligeramente más eficiente.