Foros del Web » Programación para mayores de 30 ;) » Programación General »

¿Es "correcto" cortar un bucle?

Estas en el tema de ¿Es "correcto" cortar un bucle? en el foro de Programación General en Foros del Web. Hi ! Se me planteó la duda hace poco (durante el curso que estoy haciendo de "Analista de Sistemas") y no me lo habia puesto ...
  #1 (permalink)  
Antiguo 03/07/2008, 21:15
 
Fecha de Ingreso: abril-2008
Ubicación: Montevideo - Uruguay
Mensajes: 156
Antigüedad: 16 años
Puntos: 5
Pregunta ¿Es "correcto" cortar un bucle?

Hi !

Se me planteó la duda hace poco (durante el curso que estoy haciendo de "Analista de Sistemas") y no me lo habia puesto a pensar antes.

Es lo mismo crear por ejemplo: un "for" que recorra un arreglo y frenarlo (salir de el) cuando se encuentra un elemento ... o crear un while con la condición de que se frene en cuanto encuentre dicho elemento...

¿Cual es más rápido? Son iguales?

Yo le estuve dando vueltas y me parece que aunque muchas veces la opción de "while" es buena creo que es la menos depurada. Pero en fin, ustedes dirán.

Espero sus respuestas :)

-ByE-
__________________
--
Mi Portfolio Online! Visitalo!
--
  #2 (permalink)  
Antiguo 04/07/2008, 06:25
 
Fecha de Ingreso: diciembre-2007
Mensajes: 100
Antigüedad: 16 años, 5 meses
Puntos: 0
Busqueda Respuesta: ¿Es "correcto" cortar un bucle?

Bueno se supone que cada estructura de control está pensada para un propósito específico. El FOR en principio debe aplicarse cuando conocemos el número de iteraciones que vamos a realizar. El WHILE en cambio se utiliza cuando sabemos la condición de parada pero no está tan claro el número de iteraciones.

En el ejemplo de recorrer un array hay dos condiciones de parada: Encontrar el elemento o haber llegado al final.

En estos dos ejemplos (suponiendo que ya tenemos declarado el arreglo de enteros con 25 elementos) al salir del bucle i contiene la primera posición del array donde aparece el número 3
Código:
for (i = 0; i<25; i++)
{
    if numeros[i] = 3
        break;
}
En el caso de un WHILE
Código:
i = 0
while (i<25 && numeros[i]<> 3)
{
    i ++;
}
Parece bastante más claro a la hora de visualizarlo la opción del While.

De cara al rendimiento cabe destacar que en principio los microprocesadores utilizan técnicas de predicción para mantener en caché las varialbes que presumiblemente van a ser consultadas. Para ello uno de los métodos es detectar bucles y asumir que las variables de control serán consultadas una y otra vez de manera que las mantiene en caché para que el acceso sea más rápido.

En ambos casos la variable de control estaría en caché, pero en While ademas la condición de parada de numeros[i] = 3 también se encuentra en la estructura de control por lo queparte de ese Array se mantendría en cache y la comparación sería más rapida que en el caso del for.

En casos tan breves es posible que no se aprecie diferencia, o que incluso parte de las variables dentro de la secuencia For también se incluyan en la caché por lo que creo que no habría grandes diferencias.

En general resulta bastante similar, aunque la sintaxis del While para este caso es mucho más simple.

Es algo que en realidad nunca he tenido demasiado claro por qué una cosa está mejor que la otra funcionalmente (a parte de por claridad de lectura) así que se agradecen todos los comentarios al respecto

PD: Como comentario diré que más de una persona de mi facultad suspendió exámenes por romper un FOR en casos donde podría haberse empleado un WHILE
  #3 (permalink)  
Antiguo 04/07/2008, 06:44
 
Fecha de Ingreso: abril-2008
Mensajes: 264
Antigüedad: 16 años
Puntos: 2
Respuesta: ¿Es "correcto" cortar un bucle?

Coincido en la diferencia conceptual entre ambos...
En la práctica me inclino por aquel que exprese más lo que estoy pensando. Por ejemplo si pienso "mientras pase esto..." uso un while =P

while(esto){
...
}

El for básico ya practicamente no lo uso porque asumo que la construccion foreach que hay en muchos lenguajes me abstrae del trabajo de llevar un contador, tener que pensar si el índice comienza en 0 o en 1 dependiendo del lenguaje....

Con respecto a cortar los bucles en el medio no lo veo mal. Bah, es algo natural y a veces del algoritmo. Cuando reflejas en el código la forma en que lo piensas normalmente terminas cortando en el medio.
Por ejemplo, quieres saber si algún objeto de una colección es feliz, una vez que sabes que uno es feliz, ya está, terminaste, no hace falta que evalues el resto:

Código:
foreach(ObjetoFelicidable felicidable in felicidables){
    if (felicidable.esFeliz()) return true;
}
return false;
Pero ojo, que siempre que hagas cortes en medio un bucle o mismo en una función/método debes asegurarte que eso no tenga efectos en el resto del código. Por ejemplo, te planteo:

Código:
foreach(ObjetoFelicidable felicidable in felicidables){
    objetoLogueador.log("la lista de felicidables contiene a" + felicidable.ToString());
    if (felicidable.esFeliz()) return true;
}
return false;
En ese caso si cortas en el medio probablemente parte de tu colección quedaría sin loguearse, y si lo que quieres es loguear a todos no esta bueno.

Igualmente ese es problema de que el código hace 2 cosas completamente distintas y no está bueno :P.
__________________
Saludoss
Guille
  #4 (permalink)  
Antiguo 04/07/2008, 08:06
 
Fecha de Ingreso: abril-2008
Ubicación: Montevideo - Uruguay
Mensajes: 156
Antigüedad: 16 años
Puntos: 5
Respuesta: ¿Es "correcto" cortar un bucle?

HI !

Gracias por responder, es maso menos lo que yo pensaba, no veo "tanta" diferencia de rendimiento... La cosa es que los profesores a veces se ponen insoportables con eso :P...

Ahora, en el caso del while, no es más complejo tener que evaluar las 2 condiciones y luego evaluar el conjunto ( && ) que realizar "todas" las interaciones y cortarla cuando se encuentre ?

En fin, seguiré investigando.

Gracias por las respuestas, muy utiles :)

-ByE-
__________________
--
Mi Portfolio Online! Visitalo!
--
  #5 (permalink)  
Antiguo 04/07/2008, 08:10
 
Fecha de Ingreso: abril-2008
Mensajes: 264
Antigüedad: 16 años
Puntos: 2
Respuesta: ¿Es "correcto" cortar un bucle?

Yo te diria que no... Puedes poner condiciones tannn complejas como quieras, que todo se termina resolviendo en registros del procesador y tan rápido que lo hace antes que te des cuenta.

:)
__________________
Saludoss
Guille
  #6 (permalink)  
Antiguo 04/07/2008, 10:39
 
Fecha de Ingreso: diciembre-2007
Mensajes: 100
Antigüedad: 16 años, 5 meses
Puntos: 0
Respuesta: ¿Es "correcto" cortar un bucle?

Cierto, todo todo se resuelve en los registros del micro.

Evidentemente en cosas tan simples como esta no hay mejora de rendimiento entre otras cosas poque hay sitio para todo el código en los registros del micro. En cambio para códigos más largos, continuamente se están moviendo los datos desde la RAM hacia la CACHË del micro y los registros. La lectura de RAM aunque es increiblemente rápida es mucho mas lenta que la de registros del micro, por ello es conveniene tratar de favorecer esta realidad a la hora de escribir el código.

Si vamos a los casos prácticos mas comunes de bucles con poquitas líneas no creo que merezca la pena tomarse tantas molestias.

Yo direía que poder se pede

Funcionar funciona igual (aunque como dijo guille_el3 depende del objetivo, además creo que puede llegar a ser más complicado la lectura del algoritmo el análisis del programa ya que "a simple vista" cuesta mas ver donde acaba el bucle)

El rendimiento en la mayoría de los casos es el mismo, pero bueno siendo un poco minuciosos y tratando de responder a la pregunta que hacias al principio "¿Cual es más rápido? Son iguales?" por eso hemos escrito toda esta literatura jeje. Un saludete
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 19:43.