Foros del Web » Programando para Internet » PHP »

¿Qué es más rápido, switch dentro de foreach o foreach dentro de switch?

Estas en el tema de ¿Qué es más rápido, switch dentro de foreach o foreach dentro de switch? en el foro de PHP en Foros del Web. Hola a todos, Me hallo implementando un proceso iterativo. Tengo dos formas de plantearlo, me gustaría me dijeran cual es más rápida en cuestión de ...
  #1 (permalink)  
Antiguo 06/02/2005, 16:00
 
Fecha de Ingreso: mayo-2004
Mensajes: 24
Antigüedad: 13 años, 7 meses
Puntos: 0
¿Qué es más rápido, switch dentro de foreach o foreach dentro de switch?

Hola a todos,

Me hallo implementando un proceso iterativo. Tengo dos formas de plantearlo, me gustaría me dijeran cual es más rápida en cuestión de tiempo de proceso.

FORMA A:
Código PHP:
foreach($datos as $dato) {
switch(
$letra) {
case 
'A'instruccionA($dato); break;
case 
'B'instruccionB($dato); break;
case 
'C'instruccionC($dato); break;
case 
'D'instruccionD($dato); break;
case 
'E'instruccionE($dato); break;
}

FORMA B:
Código PHP:
switch($letra) {
case 
'A'
foreach (
$datos as $dato)
instruccionA($dato);
break;
case 
'B'
foreach (
$datos as $dato)
instruccionB($dato);
break;
case 
'C'
foreach (
$datos as $dato)
instruccionC($dato);
break;
case 
'D'
foreach (
$datos as $dato)
instruccionD($dato);
break;
case 
'E'
foreach (
$datos as $dato)
instruccionE($dato);
break;


Obviamente las diferencias son un switch dentro de un foreach o un foreach dentro de un switch.

Si no hay diferencia, también aclárenmelo si pueden. Gracias.
  #2 (permalink)  
Antiguo 06/02/2005, 16:32
 
Fecha de Ingreso: febrero-2004
Mensajes: 221
Antigüedad: 13 años, 10 meses
Puntos: 0
Si las funciones se llaman instruccionA, instruccionC, etc :P lo mas rapido es

@call_user_func( 'instruccion' . $letra, $dato );

Si queres hacer benchmarks usa esta funcion

function microtime_diff($a, $b) {
list($a_dec, $a_sec) = explode(' ', $a);
list($b_dec, $b_sec) = explode(' ', $b);
return $b_sec - $a_sec + $b_dec - $a_dec;
}
  #3 (permalink)  
Antiguo 06/02/2005, 16:45
 
Fecha de Ingreso: mayo-2004
Mensajes: 24
Antigüedad: 13 años, 7 meses
Puntos: 0
Gracias por el tip, aunque realmente no es ese mi caso. InstrucciónA,B,C reemplazan a una serie de líneas únicas que tengo para cada caso.

Aquí está el código real de lo que tengo:
Código PHP:
    function imprimeDirectorio($cols 2) {
        
$n ceil(count($this->datos) / $cols);
        
$i 0;
        
$this->textoDirectorio.= "<table width='100%' cellpadding='0' cellspacing='0' border='0'><tr><td><ul>";
        foreach (
$this->datos as $dato) {
            if (
$i == $n) { // Formateo para una columna nueva
                
$i 0;
                
$this->textoDirectorio .= "</ul></td><td>";
            }
            
$this->textoDirectorio .= "<li><a href='directorio.php?d="// Inicio de cada iteración
            
switch ($this->tipo) {
                case 
'et':
                    
$this->textoDirectorio .= "ee&i=".$dato['idCliente']."'>".urldecode($dato['Empresa']); break;
                case 
'lt':
                    
$this->textoDirectorio .= "cc&i=".$dato['idCat']."'>".$dato['Categoria']; break;
                case 
'el':
                    
$this->textoDirectorio .= "ee&i=".$dato['idCliente']."'>".urldecode($dato['Empresa']); break;
                case 
'cl':
                    
$this->textoDirectorio .= "cc&i=".$dato['idCat']."'>".$dato['Categoria']; break;
                case 
'cc':
                    
$this->textoDirectorio .= "ce&i=".$dato['idCliente']."'>".urldecode($dato['Empresa']);    break;
            }
            
$this->textoDirectorio .= "</a></li>\n"// Fin de cada iteración
            
$i++;
        }
        return 
$this->getFrase() . $this->textoDirectorio;
    } 
Actualmente lo tengo como un switch dentro de un foreach. Ahora quiero saber si por tiempo de procesamiento (suponiendo que sea un número de usuarios simultáneos considerable), me conviene más repetir algunas líneas de código y pasarlo a la estructura de foreach dentro de cada caso del switch.

Gracias.
  #4 (permalink)  
Antiguo 06/02/2005, 16:58
 
Fecha de Ingreso: enero-2003
Ubicación: Córdoba, Argentina
Mensajes: 1.047
Antigüedad: 14 años, 10 meses
Puntos: 10
para empezar las dos opciones que pones no cumplen la misma funcion... y definitivamente la opcion correcta seria la primera.
__________________
oohh... quisiera ser godines!!!
  #5 (permalink)  
Antiguo 06/02/2005, 17:04
 
Fecha de Ingreso: mayo-2004
Mensajes: 24
Antigüedad: 13 años, 7 meses
Puntos: 0
Si hacen lo mismo, y si acaso me equivoqué fue porque teclee el ejemplo en ese momento, pero no te fijes en eso, sino en el tiempo de los procesos.

En términos de procesamiento, no se cuanto cuesta hacer un switch y cuanto cuesta hacer un foreach.

Si es switch toma más tiempo, entonces varios foreach dentro de un switch son mejor opción.

Si el foreach toma más tiempo, entonces un switch dentro de un foreach es mejor opción.

Sabiendo que los foreach múltiples no se cumplirían a menos que el caso del switch se cumpla, quiero saber si la opción que tengo implementada (la forma A) es mejor o si me conviene usar la forma B.

En la forma A uso menos líneas de código, y es más sencilla (al menos para mi), pero quiero eficiencia más que sencillez, asi q estaría dispuesto a usar las líneas de código adicionales si es que lo valen.
  #6 (permalink)  
Antiguo 06/02/2005, 18:37
 
Fecha de Ingreso: febrero-2005
Mensajes: 13
Antigüedad: 12 años, 10 meses
Puntos: 1
A mi parecer la forma b es la más eficiente ya que en la forma a entras al foreach y en cada vuelta del mismo evaluas el switch, cosa que en la forma b no pasa, evaluas el switch una sola vez, se ejecuta el foreach y sales del switch.

Bueno esa es mi opinión, saludos.
  #7 (permalink)  
Antiguo 06/02/2005, 19:03
Avatar de jpinedo
Colaborador
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima, Perú
Mensajes: 3.120
Antigüedad: 14 años, 2 meses
Puntos: 41
Yo creo que la segunda es la más eficiente.
Esto porque el switch se evalúa una sola vez y luego se ejecuta un foreach con sus acciones.
En el primer caso, se ejecuta un foreach y para cada elemento se evalúa el switch.

Mejor dicho, si la variable a evaluar en el switch no depende de lo que contenga el array que pasas por el foreach (como en este caso), mejor lo evalúas primero.

No tiene sentido estarse preguntando a cada momento $letra=="A"??, $letra=="B"??, etc... basta con evaluarlo una vez.

Otra cosa sería si esa variable $letra dependiera de $dato... ahí sí habría que evaluarla y definitivamente se tendría que utilizar el primer caso.

Saludos
  #8 (permalink)  
Antiguo 06/02/2005, 19:09
Avatar de jpinedo
Colaborador
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima, Perú
Mensajes: 3.120
Antigüedad: 14 años, 2 meses
Puntos: 41
Bueno... tardé demasiado en terminar de responder... Lo que yo digo es exactamente lo que pone JuanJodm.
de todos modos siempre puede evaluar el tiempo que tardan tus scripts en ejecutarse. Haz varias pruebas con una y otra manera y verás de manera experimental si se cumple lo que te pusimos.

Saludos
  #9 (permalink)  
Antiguo 06/02/2005, 20:14
 
Fecha de Ingreso: enero-2003
Ubicación: Córdoba, Argentina
Mensajes: 1.047
Antigüedad: 14 años, 10 meses
Puntos: 10
poero si en cambio el contenido de la variable $letra cambia cada vez que pasas por el foreach si o si tenes que usar la forma A, porque si no solo tomaria en cuenta el primer valor de esa variable y despues evaluaria como si todas las otras fuesen la misma.
__________________
oohh... quisiera ser godines!!!
  #10 (permalink)  
Antiguo 06/02/2005, 21:39
 
Fecha de Ingreso: febrero-2004
Mensajes: 221
Antigüedad: 13 años, 10 meses
Puntos: 0
Safe, si eso fuera probable, esta pregunta no estaria planteada.
  #11 (permalink)  
Antiguo 06/02/2005, 22:20
 
Fecha de Ingreso: enero-2003
Ubicación: Córdoba, Argentina
Mensajes: 1.047
Antigüedad: 14 años, 10 meses
Puntos: 10
creo que tenes razon... aunque pensandolo bien, si no es asi tampoco entiendo porque esta planteada.
__________________
oohh... quisiera ser godines!!!
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 16:06.