Posts Tagged ‘optimización bucles’

junio 22, 2009 10

¿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: , ,