php - switch - La diferencia entre los bucles
switch php (11)
Se trata de PHP, pero no tengo dudas de que muchos de los mismos comentarios se aplicarán a otros idiomas.
En pocas palabras, ¿cuáles son las diferencias en los diferentes tipos de bucle para PHP? ¿Es uno más rápido / mejor que los demás o debería simplemente ponerlo en el ciclo más fácil de leer?
for ($i = 0; $i < 10; $i++)
{
# code...
}
foreach ($array as $index => $value)
{
# code...
}
do
{
# code...
}
while ($flag == false);
Con un bucle foreach, se hace una copia de la matriz original en la memoria para usar dentro.
Foreach es agradable, pero tiene una advertencia importante: no puede modificar el enumerable que está iterando.
Ambos no serán un problema si pasa por referencia en lugar de valor:
foreach ($array as &$value) {
Creo que esto ha sido permitido desde PHP 5.
@brendan:
El artículo que citó está muy desactualizado y la información es simplemente incorrecta. Especialmente el último punto (use for
lugar de foreach
) es engañoso y la justificación ofrecida en el artículo ya no se aplica a las versiones modernas de .NET.
Si bien es cierto que IEnumerator
utiliza llamadas virtuales, estas pueden ser inline por un compilador moderno. Además, .NET ahora conoce los genéricos y los enumeradores fuertemente tipados.
Hay muchas pruebas de rendimiento que prueban de manera concluyente que generalmente no es más rápido que foreach
. Aquí hay un ejemplo .
Al acceder a los elementos de una matriz, para mayor claridad usaré foreach siempre que sea posible, y solo usaré un para si necesita los valores de índice reales (por ejemplo, el mismo índice en múltiples matrices). Esto también minimiza la posibilidad de errores tipográficos ya que para los bucles esto es muy fácil. En general, PHP puede no ser el lugar donde preocuparse demasiado por el rendimiento. Y por último pero no menos importante, para y foreach tienen (o deberían tener, no soy un PHP-er) el mismo tiempo Big-O (O (n)) por lo que está buscando posiblemente una cantidad pequeña de uso de memoria o un ligero golpe constante o lineal en el tiempo.
Cada construcción de bucle cumple un propósito diferente.
for - Esto se usa para repetir un número específico de iteraciones.
foreach: se usa para recorrer todos los valores de una colección.
while - Esto se usa para realizar bucles hasta que cumplas una condición.
De los tres, "mientras" probablemente proporcionará el mejor rendimiento en la mayoría de las situaciones. Por supuesto, si haces algo como lo siguiente, básicamente estás reescribiendo el bucle "for" (que en c # es un poco más eficiente).
$count = 0;
do
{
...
$count++;
}
while ($count < 10);
Todos tienen diferentes propósitos básicos, pero también se pueden usar de la misma manera. Depende completamente del problema específico que estás tratando de resolver.
Con un bucle foreach, se hace una copia de la matriz original en la memoria para usar dentro. No deberías usarlos en estructuras grandes; un simple for loop es una mejor opción. Puede usar un ciclo while de manera más eficiente en una estructura grande no indexada numéricamente como esta:
while(list($key, $value) = each($array)) {
Pero ese enfoque es particularmente feo para una estructura pequeña y simple.
mientras que los bucles son más adecuados para realizar bucles a través de transmisiones, o como en el siguiente ejemplo que ve con mucha frecuencia en PHP:
while ($row = mysql_fetch_array($result)) {
Casi todo el tiempo los diferentes bucles son intercambiables, y se reducirá a a) eficiencia, ob) claridad.
Si conoces las compensaciones de eficiencia de los diferentes tipos de bucles, entonces sí, para responder a tu pregunta original: usa la que parece más limpia.
El rendimiento no es significativamente mejor en ningún caso. Si bien es útil para tareas más complejas que iterar, pero for
y while
son funcionalmente equivalentes.
Foreach
es agradable, pero tiene una advertencia importante: no puede modificar el enumerable que está iterando. Así que no eliminar, agregar o reemplazar entradas a / en él. La modificación de entradas (como cambiar sus propiedades) está bien, por supuesto.
Esto es CS101, pero dado que nadie más lo mencionó, mientras que los bucles evalúan su condición antes del bloque de código, y do-while evalúa después del bloque de código, los bucles do-while siempre tienen la garantía de ejecutar su bloque de código al menos una vez, independientemente de la condición.
Uso el primer ciclo al iterar sobre una matriz convencional (¿indexada?) Y el ciclo foreach cuando se trata de una matriz asociativa. Simplemente parece natural y ayuda a que el código fluya y sea más legible, en mi opinión. En cuanto a hacer ... mientras bucles, los uso cuando tengo que hacer algo más que solo hojear una matriz.
Aunque no estoy seguro de ningún beneficio en el rendimiento.
Para bucles Loop y While son bucles de condición de entrada. Primero evalúan la condición, por lo que el bloque de instrucción asociado con el bucle no se ejecutará ni siquiera una vez si la condición no se cumple
Las instrucciones dentro de este bloque de bucle se ejecutarán 10 veces, el valor de $ i será de 0 a 9;
for ($i = 0; $i < 10; $i++)
{
# code...
}
Lo mismo que hace con while loop:
$i = 0;
while ($i < 10)
{
# code...
$i++
}
El ciclo Do-while es el ciclo de condición de salida. Se garantiza que se ejecutará una vez, luego evaluará las condiciones antes de repetir el bloqueo
do
{
# code...
}
while ($flag == false);
foreach se usa para acceder a los elementos de la matriz de principio a fin. Al comienzo del ciclo foreach, el puntero interno de la matriz se establece en el primer elemento de la matriz, en el siguiente paso se establece en el segundo elemento de la matriz y así sucesivamente hasta que la matriz finalice. En el bloque de bucle El valor del elemento de matriz actual está disponible como $ valor y la clave del elemento actual está disponible como $ index.
foreach ($array as $index => $value)
{
# code...
}
Podrías hacer lo mismo con while loop, así
while (current($array))
{
$index = key($array); // to get key of the current element
$value = $array[$index]; // to get value of current element
# code ...
next($array); // advance the internal array pointer of $array
}
Y por último: el Manual PHP es tu amigo :)
En lo que respecta al rendimiento, un foreach es más consumidor que un