Generalmente, existen tres métodos para recorrer una matriz: for, while y foreach. El más simple y conveniente de ellos es foreach. Entonces, ¿cuáles son las diferencias en funcionamiento y rendimiento entre ellos? ¿Qué método suele ser mejor utilizar?
Primero probemos el tiempo que lleva atravesar una matriz unidimensional con 50.000 subíndices:
Plataforma de prueba:
CPU: PM 725
Memoria: 512M
Disco duro: 40G 5400rpm
Sistema operativo: Windows XP SP2
WEB: apache 2.0.54 php5.0.4
código de prueba:
<?php
/*
* @ Autor: Lilov
* @ Página de inicio: www.codesky.com
* @ Correo electrónico: [email protected]
*
*/
$arr = matriz();
para($i = 0; $i < 50000; $i++){
$arr[] = $i*rand(1000,9999);
}
función GetRunTime()
{
lista($usec,$sec)=explode(" ",microtime());
return ((float)$usec+(float)$sec);
}
#####################################
$time_start = GetRunTime();
para($i = 0; $i < recuento($arr); $i++){
$cadena .= $arr[$i];
}
$time_end = GetRunTime();
$time_used = $time_end - $time_start;
echo 'Tiempo usado para:'.round($time_used, 7).'(s)<br><br>';
unset($cadena, $time_start, $time_end, $time_used);
#####################################
$time_start = GetRunTime();
mientras(lista($clave, $val) = cada($arr)){
$cadena .= $val;
}
$time_end = GetRunTime();
$time_used = $time_end - $time_start;
echo 'Tiempo usado de while:'.round($time_used, 7).'(s)<br><br>';
unset($cadena, $clave, $val, $time_start, $time_end, $time_used);
#####################################
$time_start = GetRunTime();
foreach($arr como $clave => $val){
$cadena .= $val;
}
$time_end = GetRunTime();
$time_used = $time_end - $time_start;
echo 'Tiempo usado de foreach:'.round($time_used, 7).'(s)<br><br>';
#####################################
?>
Resultados de la prueba:
promediar los tres resultados de la prueba:
Corresponde a for, while, foreach respectivamente
0.1311650
0.1666853
0.1237440
Después de repetidas pruebas, los resultados muestran que para atravesar la misma matriz, foreach es el más rápido y el más lento es while. foreach es aproximadamente un 20% ~ 30% más rápido que while. Luego aumente el subíndice de la matriz a 500000 y 5000000, y los resultados de la prueba serán los mismos. Pero desde un punto de vista principal, foreach opera en una copia de la matriz (copiando la matriz), mientras que while opera moviendo el índice interno de la matriz. En términos generales, se cree que while debería ser más rápido que foreach (porque. foreach primero coloca la matriz (la matriz se copia, mientras que while mueve el puntero interno directamente), pero el resultado es todo lo contrario. La razón debería ser que foreach es una implementación interna de PHP, mientras que while es una estructura de bucle general.
Por lo tanto, en aplicaciones generales, prefiero usar el formulario foreach, que es simple y eficiente. En PHP5, foreach también puede atravesar los atributos de una clase.