En primer lugar, entiendo que en el 90% de las aplicaciones la diferencia de rendimiento es completamente irrelevante, pero solo necesito saber cuál es la construcción más rápida. Eso y ...
La información actualmente disponible sobre ellos en la red es confusa. Mucha gente dice que foreach es malo, pero técnicamente debería ser más rápido, ya que se supone que simplifica la escritura de un recorrido de matriz usando iteradores. Los iteradores, que nuevamente se supone que son más rápidos, pero en PHP también aparentemente son muy lentos (¿o no es esto una cosa de PHP?). Estoy hablando de las funciones de matriz: next () prev () reset () etc. bueno, si son incluso funciones y no una de esas características del lenguaje PHP que parecen funciones.
Para reducir esto un poco : no me interesa atravesar matrices en pasos de más de 1 (tampoco hay pasos negativos, es decir, iteración inversa). Tampoco estoy interesado en un recorrido hacia y desde puntos arbitrarios, solo 0 a la longitud. Tampoco veo la manipulación de matrices con más de 1000 claves sucediendo de forma regular, ¡pero sí veo una matriz atravesada varias veces en la lógica de una aplicación! También en cuanto a las operaciones, en gran parte solo la manipulación de cuerdas y el eco.
Aquí hay algunos sitios de referencia:
http://www.phpbench.com/
http://www.php.lt/benchmark/phpbench.php
Lo que escucho en todas partes:
foreach
es lento, y por lo tantofor
/while
es más rápido- PHP
foreach
copia la matriz sobre la que itera; para hacerlo más rápido necesitas usar referencias - código como este: es más rápido que un
$key = array_keys($aHash); $size = sizeOf($key);
for ($i=0; $i < $size; $i++)foreach
Este es mi problema. Escribí este script de prueba: http://pastebin.com/1ZgK07US y no importa cuántas veces ejecute el script, obtengo algo como esto:
foreach 1.1438131332397
foreach (using reference) 1.2919359207153
for 1.4262869358063
foreach (hash table) 1.5696921348572
for (hash table) 2.4778981208801
En breve:
foreach
es más rápido queforeach
con referenciaforeach
es más rápido quefor
foreach
es más rápido quefor
para una tabla hash
¿Alguien puede explicarlo?
- ¿Estoy haciendo algo mal?
- ¿PHP para cada cosa de referencia realmente está haciendo una diferencia? Quiero decir, ¿por qué no lo copiaría si pasa por referencia?
- ¿Cuál es el código de iterador equivalente para la instrucción foreach? He visto algunos en la red, pero cada vez que los pruebo, el tiempo está muy lejos; También probé algunas construcciones de iteradores simples, pero parece que nunca obtengo resultados decentes: ¿los iteradores de matriz en PHP son simplemente horribles?
- ¿Hay formas / métodos / construcciones más rápidas para iterar a través de una matriz que no sea FOR / FOREACH (y WHILE)?
Versión de PHP 5.3.0
Editar: Respuesta Con la ayuda de la gente de aquí, pude juntar las respuestas a todas las preguntas. Los resumiré aquí:
- "¿Estoy haciendo algo mal?" El consenso parece ser: sí, no puedo usar el eco en los puntos de referencia. Personalmente, todavía no veo cómo echo es alguna función con tiempo aleatorio de ejecución o cómo cualquier otra función es de alguna manera diferente; eso y la capacidad de ese script para generar exactamente los mismos resultados de foreach mejor que todo es difícil para explicar aunque solo "estás usando echo" (bueno, ¿qué debería haber estado usando). Sin embargo, reconozco que la prueba debería hacerse con algo mejor; aunque no se me ocurre un compromiso ideal.
- "¿PHP para cada cosa de referencia realmente hace una diferencia? Quiero decir, ¿por qué no lo copiaría si pasa por referencia? ircmaxell muestra que sí, las pruebas adicionales parecen demostrar que en la mayoría de los casos la referencia debería ser más rápida, aunque dado mi fragmento de código anterior, definitivamente no significa todo. Acepto que el problema probablemente no sea demasiado intuitivo para molestarse en ese nivel y requeriría algo extremo, como la descompilación, para determinar cuál es mejor para cada situación.
- "¿Cuál es el código de iterador equivalente para la declaración foreach? He visto algunos en la red, pero cada vez que los pruebo, el tiempo está muy lejos. También probé algunas construcciones de iterador simples pero nunca parece obtener resultados decentes - ¿Son los iteradores de matriz en PHP simplemente horribles? " ircmaxell proporcionó la respuesta a continuación; aunque el código solo puede ser válido para la versión PHP> = 5
- "¿Hay formas / métodos / construcciones más rápidas para iterar a través de una matriz que no sea FOR / FOREACH (y WHILE)?" Gracias a Gordon por la respuesta. El uso de nuevos tipos de datos en PHP5 debería mejorar el rendimiento o la memoria (cualquiera de los cuales podría ser deseable según su situación). Si bien en cuanto a la velocidad, muchos de los nuevos tipos de arreglos no parecen ser mejores que arreglo (), splpriorityqueue y splobjectstorage parecen ser sustancialmente más rápidos. Enlace proporcionado por Gordon: http://matthewturland.com/2010/05/20/new-spl-features-in-php-5-3/
Gracias a todos los que intentaron ayudar.
Probablemente me quedo con foreach (la versión sin referencia) para cualquier recorrido simple.