lunes, 1 de septiembre de 2014

Debugging - Optimizacion (y III)

En el post anterior vimos en detalle como el compilador tomaba algunas decisiones para optimizar nuestro código.

La decisión que más impacto tenía era que detectaba que una función era llamada con datos estáticos y realizaba la operación de la función directamente en el tiempo de la compilación.

Eso nos puede dar una idea de como optimizar el código: evitar las variables para referenciar valores fijos y colocar esos valores directamente en el programa. Esta solución, no obstante, golpea en la línea de flotación de otros conceptos de programación. En especial a la hora de simplificar el mantenimiento de los programas. No es viable buscar valores constantes a lo largo del programa para modificarlos.
Parece que nos encontramos ante un dilema: ¿rendimiento o mantenimiento?.

Una vez más el compilador nos va a ayudar y nos va a permitir juntar ambas prioridades mediante la cláusula #define

La cláusula #define tiene esta sintaxis:

#define token  value

Ej:

#define thisyear 2104

Podemos asimilarla a una asignación de variables por ejemplo

int thisyear = 2014; 

Pero hay  varias diferencias importantes:

  • La directiva #define no reserva espacio en ningún lado. Simplemente "recuerda" que thisyear es 2014. 
  • El ámbito (scope) de la directiva está restringido a la compilación del programa el ámbito de una variable está en la ejecución del programa. 

El compilador da una primera lectura del programa fuente para procesar todas las directivas y crea una tabla interna donde relaciona cada token con su valor. En la siguiente lectura sustituye cada token por su valor y realiza las diversas fases de la compilación.
Podemos comprobarlo modificando nuestro programa haciendo que quede:

#define a 1
#define b 2
#define c 3

.
.
.
.

sumaternaria(a, b, c)
... 

Que compilamos y vemos el listado en ensamblador:


Que no difiere en nada del obtenido en la compilación con los valores puestos directamente en la llaamda a la función.

Y que contrasta con el listado de la compilación resultante de cargar las constantes en variables.




Conclusiones. 

Finaliza esta serie de artículos sobre optimización en la que solo hemos tratado de una de las muchas formas con la que podemos optimizar un programa jugando con las opciones del compilador y el diseño de los programas.

Y vistas todas las opciones que tiene un compilador.... hay mucho por trabajar y descubrir.

Espero que esta contribución sirva de punto de arranque para que os animéis a investigar en este apasionante y rentable aspecto de la programación.