Portada arrow Artículos arrow Operaciones innecesarias en el interior de los bucles
Operaciones innecesarias en el interior de los bucles
miércoles, 21 de marzo de 2007

Demasiado trabajoUn despiste que cometemos frecuentemente es la inclusión de operaciones en la condición de repetición de un bucle o incluso en su interior, y que conducen a la evaluación de la misma expresión en cada iteración.

Si la evaluación de esa expresión tiene asociado un coste no constante, estaremos aumentando innecesariamente la complejidad de nuestro algoritmo, y si el coste es constante, aun así estaremos aumentando el tiempo de ejecución, haciendo que en los bucles se realice una y otra vez el mismo trabajo.

Dicho así, puede resultar un poco extraño, pero con un ejemplo se ve mucho más claro. Observa éste código en C#:

String s1 = "Esto es un simple ejemplo";
String s2 = "eje";
for (int i = 0; i < s1.IndexOf(s2); i++)
   {
       Console.Write(s1[i]);
   }
 

Lo de menos es su objetivo... Lo importante es el desliz que hemos cometido.

Hemos hecho un bucle, y en la condición del bucle hacemos la siguiente comparación "i<s1.IndexOf(s2)". El método IndexOf de la clase String nos devuelve la posición de la cadena s2 dentro de la cadena s1. Esta es una operación costosa, es decir, calcularla implica un coste no constante.

Al incluirla en la condición del bucle hacemos que el compilador la tenga que evaluar en cada vuelta del bucle, y sin embargo, todas las veces devolverá el mismo resultado. Es un valor constante que podemos conocer antes de entrar en el bucle.

Obviamente, este efecto podía haberse evitado fácilmente: sacando esa evaluación del bucle:

String s1 = "Esto es un simple ejemplo";
String s2 = "eje";
int posicion = s1.IndexOf(s2);
for (int i = 0; i < posicion ; i++)
   {
       Console.Write(s1[i]);
   }
 

En otras ocasiones, el despiste no lo colocamos en la condición del bucle, sino en su interior. Por ejemplo:

int a = 5;
int b = 9;
for (int i = 0; i < 100; i++)
{
   int c = a + b;
   Console.WriteLine(c);
}
 

En este caso, el problema está en el interior del bucle, y no en la condición. En el interior del bucle, la línea "int c=a+b;" se ejecuta cien veces, y sin embargo, todas las veces c vale 14. ¿Por qué repetir el cálculo de a+b 100 veces? Nuevamente, esa línea debería estar fuera del bucle.

int a = 5;
int b = 9;
int c = a + b;
for (int i = 0; i < 100; i++)
{
   Console.WriteLine(c);
}
 

En conclusión, debemos asegurarnos de que todas las sentencias del interior del bucle, y todas las expresiones involucradas en la condición deben tener algo que ver con el propio desarrollo del bucle. Si cualquiera de ellas pudiera ejecutarse fuera del bucle y antes de entrar en éste, es necesario que así sea para evitar mermas innecesarias en la eficiencia del algoritmo.

Realmente, estos "deslices" no suelen causar problemas demasiado graves ya que como puedes ver, el resultado de la ejecución es el mismo. Puntualmente, a cualquiera le puede pasar, pero desde luego dirá mucho a favor de nuestra elegancia programando que este tipo de deslices nunca figuren en nuestros bucles.

 
←Artículo anterior   Artículo siguiente→

Categorías

  • Ingeniería del software  ( 4 artículos )

    Acerca de la ingeniería del software y el ciclo de vida del software.

  • El programador elegante  ( 12 artículos )
    Una serie de artículos dedicados a buenas prácticas en programación
  • Opinión  ( 7 artículos )

    Artículos de opinión, no necesariamente fundamentada.

  • Básico  ( 12 artículos )

    Artículos básicos sobre temas básicos.

     

¿Quién está en línea?

 web tracker

Suscríbete

RSS feed Sindicación RSS

(¿Qué es la sindicación RSS?)


Suscribir por e-mail

¿Dónde estoy?

Estás en La tecla de ESCAPE, un sitio web personal en el que nos gusta hablar de algoritmos, informática, tecnología, ciencia, ingeniería, internet... y cualquier tontería que se nos ocurra. El punto de vista de nuestros artículos técnicos suele ser muy básico, así que a menudo adoptamos grandes simplificaciones. (Más...-Términos de uso)