jump to navigation

Algorithm Optimizations

Revisando un poco la bibliografía existente y según mi experiencia como desarrollador en empresas de telecomunicaciones, quise resumir un poco los principales tips que se deben tener en cuenta al momento de desarrollar algoritmos en lenguajes Orientados a Objetos (OO) como lo es Java y C# de .Net.

Aunque creo que estos comentarios se pueden extrapolar a una gran diversidad de situaciones y lenguajes, pues lo que siempre se busca es tratar de ser lo más óptimo posible en un flujo dado.

A continuación presento los 9 tips básicos que propongo a tener en cuenta. Sin duda alguna, estos están entrelazados y se podría decir que también son interdependientes.

1. Evitar lo más posible las iteraciones For While For Each, etc. Esto está muy relacionado con el uso de listas. Conocer o estimar el Orden de las operaciones en general.

2. Controlar la creación de nuevos objetos. Centralizar la invocación de New para tener una visión puntual de su impacto. Pues esto puede ocasionar una sobrecarga del RAM.

3. Cuidado con la copia de elementos. Implementar la sobreescritura del método base clone().

4. Utilizar el patrón de programación Factory y utilizar con cuidado los métodos tipo static.

5. Usar un herramienta tipo Profiler para identificar con exactitud las operaciones que requieren más tiempo de procesamiento. Recomiendo el que trae por defecto NetBeans. Siempre hay que tener números que respalden las optimizaciones o para justificar el tiempo en ellas. Todo gerente de sistemas o coordinador de proyecto deberá presentar estos números para asignar recursos a estas actividades.

6. Mantener la lógica de las propiedades o métodos de cada objeto/clase fiel a su naturaleza. No dispersar las operaciones en todo el algoritmo.

7. No molestarse en borrar elementos, solo dejar de apuntar a ellos. El recolector de basura se hará cargo de ellos (esto depende porque el Garbage Collector de Java es más eficiente que los de C# e incluso C, donde hay que hacer dispose() a los elementos).

8. Utilizar la implementación o estructura de Lista más conveniente según las necesidades (Hashmap, Hashtable, Array, ListArray, LinkedList, etc.). Considerar si se debe buscar / eliminar / agregar / actualizar por posición (index). Luego, estas operaciones deben quedar encapsuladas para un fácil y rápido reemplazo de ser necesario.

9. Definir la ubicación de los interruptores de iteraciones o bucles (break o return) o de flujos en general que sean necesarios para no invertir tiempo en operaciones que no son trascendentes.

Por otra parte existen aspectos como son la Distribución, el Paralelismo y el Uso de Cache, que permite optimizaciones más avanzadas pero requieren una visión de implantación más amplia y compleja. Los comentarios anteriores se basan en algoritmos secuenciales básicos.

BIBLIOGRAFIA:

Introduction to Algorithms, Second Edition (2001)
Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, Clifford Stein

Java Performance Tuning, Second Edition (2003)
Jack Shirazi

Effective Java, Second Edition (2008)
Joshua Bloch

Comments»

1. Victor ROJAS BRACHO - February 17, 2011

Excelente Joseph …. Felicitaciones!


Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

%d bloggers like this: