junio 22, 2009 9

¿Cuál es el mejor método para recorrer un array en PHP?

By in PHP

Hace poco leí este interesante artículo: “for reverso para grandes iteraciones en JavaScript”. Hoy, mientras viajaba en metro de camino a casa, he pensado que sería interesante ver si esto ocurre también PHP. Para ello he usado la herramienta que comenté ayer (PHP Quick Profiler). Para ello he realizado cinco test:

  1. Usando la estructura foreach.
  2. Usando la estructura foreach y obteniendo la clave.
  3. Usando una iteración for ascendente.
  4. Usando una iteración for ascendente pero almacenando el tamaño del array en una variable.
  5. Usando una iteración for descendente.

La prueba realizada ha sido obtener el sumatorio de los elementos del array. El array tiene un tamaño de 300.000 elementos, obtenidos de forma aleatoria previamente a las pruebas. El código de cada una de las pruebas es el siguiente (el código del tercer se ha corregido gracias al comentario de SERGI):

// Test Nº 1
$total = 0;
foreach ($a as $item)
{
    $total += $item;
}

// Test Nº 2
$total = 0;
foreach ($a as $key => $item)
{
    $total += $item;
}

// Test Nº 3
$total = 0;
for($i = 0; $i < count($a); $i++)
{
    $total += $a[$i];
}

// Test Nº 4
$total = 0;
$fin = count($a);
for($i = 0; $i < $fin; $i++)
{
    $total += $a[$i];
}

// Test Nº 5
$total = 0;
for($i = count($a) -1; $i >= 0; $i--)
{
    $total += $a[$i];
}

Y los resultados han sido los siguientes:

Test Tiempo de ejecución
Nº 1 29.645 ms
Nº 2 38.315 ms
Nº 3 129.727 ms
Nº 4 35.427 ms
Nº 5 43.789 ms

Como se puede apreciar en el caso de PHP lo más rápido a la hora de recorrer un array parece que es usar la estructura foreach, aunque no presenta mucha diferencia con los bucles for cuando no se llama a la función count.

Personalmente para recorrer un array yo prefiero usar la construcción foreach, creo que así el código queda mucho más claro, aunque a raíz de esta pequeña prueba lo importante es realizar comparaciones simples en el for sin llamar a ninguna función.

Estas pruebas son mejorables, por ejemplo realizando varias pruebas y en un entorno más controlado que el equipo que he usado, pero creo que nos puede dar un breve indicio de como optimizar mejor nuestro código en cosas a las que no prestamos la suficiente atención.

Comparte esta entrada:
Delicious Digg Google Technorati Menéame Fresqui Reddit Facebook Twitter Yahoo! Buzz MySpace Email BarraPunto

Tags: , ,

9 Responses to “¿Cuál es el mejor método para recorrer un array en PHP?”

  1. caos30 dice:

    Creo que no has sido muy exacto al “copiar y pegar” el código de tus pruebas. ¿estás seguro de que en el test #3 no está equivocado?

    ¿En lugar de
    $total += $item;
    no debería poner
    $total += $a[$i];
    igual que en los dos últimos tests?

    Y por otra parte el resultado excesivamente alto del test 3 no será precisamente porque la función count() se ejecuta en cada iteración del bucle, pues forma parte de la condición (en este caso una desigualdad) que se comprueba en cada iteración para ver si hay que continuar o no con el bucle?! por eso se hace tan lenta!

    En todo caso, me ha gustado mucho tu ejercicio práctico ;) muy buena idea!! Gracias!

    Un saludote,
    SERGI

  2. Manuel Jesús Carrascosa de la Blanca dice:

    Tienes razón, en el test Nº 3 debería poner:

    $total += $a[$i];

    A mi me da también que la gran diferencia que hay entre el test Nº 3 y los demas se debe a la llamada la función count(), lo cual es bastante lógico. No se como hará internamente las llamadas a las funciones, de hecho desconozco por completo como funciona el interprete de PHP, pero supongo que lo hará mediante una pila y con toda la parafernalia que ello conlleva, haciendo más lenta la ejecución.

    Por cierto, gracias por avisar del error ;) .

  3. Eduardo dice:

    Este blog es muy interesante y prometedor.

  4. Jorge dice:

    Excelente aporte, casualmente quería saber cual era mas rápido para recorrer arrays y aquí tengo la respuesta. Piensen que aunque la diferencia no sea muy grande en algunos casos no cuesta nada cambiar el código y así hacer una programación preparada para grandes volúmenes de datos en caso de ser necesario.

  5. La 3,4,5 funcionarian mas rapido asi:Ejemplifico solo con la 3:$total = 0;$num = count($a);for($i = 0; $i < $num; $i++){    $total += $a[$i];}Ya que de ese modo la funcion count() es llamada solo una vez.Saludos…!

  6. La 3,4,5 funcionarian mas rapido asi:Ejemplifico solo con la 3:$total = 0;//la funcion count() es llamada$num = count($a);for($i = 0; $i < $num; $i++){    $total += $a[$i];}Ya que de ese modo la funcion count() es llamada solo una vez.Saludos…!

  7. Lo primero de todo, me parece genial que hagas este tipo de estudios. Aunque sea sencillo, dentro de un montón de código más, puede llegar a ralentizar la Página Web una barbaridad.De todas formas creo que caos30 tiene razón, el códido debieras optimizarlo.

  8. Aguilared dice:

    [...] ¿Cuál es el mejor método para recorrer un array en PHP? | mjcarrascosa.com. [...]

  9. Ricardo dice:

    Seria interesante haberlos recorrido con un while, muy buen aporte.

Leave a Reply