lunes, 27 de abril de 2009

Optimización de código

Durante el tiempo que llevo desarrollando software uno de los aspectos que mejor se me ha quedado grabado en la mente. En los inicios todo desarrollador novato se siente contento tan sólo con que su código funcione y "haga lo que debe". Pero con el transcurso del tiempo uno se va dando cuenta que una aplicación informática no sólo debe hacer lo que debe sino que debe hacerlo rápido y con el menor consumo de recursos de la máquina posible.

Personalmente los retos importante de optimización a los que me he enfrentado los he encontrado en dos aplicaciones de naturaleza distinta. La primera de ellas una aplicación de tratamiento de imágenes ecográficas desarrollada en C++. La segunda una aplicación web RIA (Rich Internet Application) desarrollada en Flex y que usa servicios Java. En ambos casos casos le hecho de tener un código ineficiente puede suponer que la aplicación no sea usable. En el primer caso, puedo decir que el tratamiento de imágenes es muy costoso y se basa en convoluciones de matrices, por lo tanto optimizar dichas operaciones puede suponer una disminución del coste y sobre todo del tiempo de espera para obtener los resultados. En el segundo caso el problema es obvio, si hemos decidido desarrollar una aplicación rica es porque queremos que la "experiencia del usuario" (User Experience o UX) sea de calidad. Un código poco optimizado puede arruinar esa "experiencia de usuario". Por tanto, en adelante trataré de describir mis experiencias optimizando código así como el uso de algunas herramientas para dicha labor.

A la hora de optimizar el código tenemos dos grandes bloques principalmente: la optimización de la velocidad y la optimización de los recursos

Optimización de velocidad

Se basan en optimizar el código eliminando código inútil y/o redundante para que las operaciones se realicen los más rápidamente posible.

Las técnicas más básicas y obvias de este tipo son:
  • Eliminar código innecesario. Muchas veces se deja código que no hace nada pululando por ahí.
  • Encapsular la funcionalidad en Funciones/procedimientos adecuadamente.
  • No realizar llamadas innecesarias.
  • Optimización de bucles. Controlar el número de iteraciones, para no iterar innecesariamente y sacar el código que no sea especifico del bucle.
  • Restringir el uso de operaciones de Strings. Las concatenaciones y extracciones de string son bastante costosas.
  • Pasar objetos por referencia mejor que por valor, ya que nos ahorramos copiar el objeto.
  • Minimizar el acceso a disco.
Optimización de recursos
En este caso lo que queremos es que la funcionalidad se desempeño usando el mínimo numero de recursos como la memoria y liberando todos los recursos no usados al finalizar evitando fugas de memoria (memory leaks), que progresivamente ralentizarán la aplicación y pueden llegar a colgarla.
Las técnicas más básicas y obvias de este tipo son:
  • Liberar los recursos (memoria) una vez se termina de usar. Dicho así puede parecer fácil, pero dependiendo del lenguaje que usemos la cosa puede complicarse, más adelante explicare las complicaciones que pueden darse en un entorno Flex al tratar con componentes de la interfaz gráfica.
  • Intentar que nuestros módulos/librerías tengan el menor tamaño posible.
  • Si usamos librerías/módulos parcialmente no tenemos por que cargar todo, cargaremos sólo lo que usaremos.
En adelante iré publicando algunos artículos sobre mis vivencias con la optimización de código, espero que les ayude.

2 comentarios:

  1. Buenas tardes, el tema es interesante, cuando tengas mas información, te agradeceria si me informas (vzuara@hotmail.com)

    ResponderEliminar
  2. En la sección de optimización puedes encontrar algunos post sobre optimización, la verdad que están enfocados a Flex, pero intentaré ir añadiendo cosas genéricas sobre optimizacion.

    Según vaya añadiendo iré informando.

    Saludos

    ResponderEliminar