for (i=0 ; i<=10; i++)
{
..
..
}
i=0;
while(i<=10)
{
..
..
i++;
}
En y para while loop, ¿cuál es mejor, rendimiento sabio?para y while loop en C#
for (i=0 ; i<=10; i++)
{
..
..
}
i=0;
while(i<=10)
{
..
..
i++;
}
En y para while loop, ¿cuál es mejor, rendimiento sabio?para y while loop en C#
(actualización) En realidad, hay un escenario donde la construcción for
es más eficiente; bucle en una matriz. El compilador/JIT tiene optimizaciones para este escenario , siempre y cuando se utilizaarr.Length
en la condición:
for(int i = 0 ; i < arr.Length ; i++) {
Console.WriteLine(arr[i]); // skips bounds check
}
En este caso muy específico, que se salta las comprobación de límites, como ya sabe que nunca lo hará estar fuera de límites. Curiosamente, si "elevación" arr.Length
a tratar de optimizar de forma manual, se evita que esto suceda:
int len = arr.Length;
for(int i = 0 ; i < len ; i++) {
Console.WriteLine(arr[i]); // performs bounds check
}
Sin embargo, con otros recipientes (List<T>
etc), de elevación es bastante razonable como un manual de micro-optimización.
(actualización final)
Ni; un bucle for se evalúa como un ciclo while debajo del capó de todos modos.
Por ejemplo 12.3.3.9 de ECMA 334 (asignación definitiva) dicta que un bucle for:
for (for-initializer ; for-condition ; for-iterator) embedded-statement
es esencialmente equivalente (de una perspectiva asignación definitiva (no es lo mismo que decir "el compilador debe generar esta IL ")) como:
{
for-initializer ;
while (for-condition) {
embedded-statement ;
LLoop:
for-iterator ;
}
}
con seguir las declaraciones que se dirigen a de la instrucción que se está traducida a goto declaraciones dirigidas a la etiqueta LLoop. Si se omite la condición forzada de la instrucción for, la evaluación de la asignación definitiva procede como si la condición forzada fuera reemplazada por verdadera en la expansión anterior .
Ahora bien, esto no significa que el compilador tiene que hacer exactamente lo mismo, pero en realidad es más o menos lo hace ...
Ninguno de los dos. Ellos son equivalentes. Puede pensar que el bucle 'for' es una forma más compacta de escribir el while-loop.
Yo diría que son lo mismo y nunca debería hacer tales micro-optimizaciones de todos modos.
Sí, son fragmentos de código equivalentes.
El rendimiento será el mismo. Sin embargo, a menos que necesite acceder a la variable i
fuera del ciclo, debe usar el ciclo for
. Esto será más limpio ya que i
solo tendrá alcance dentro del bloque.
La eficacia del programa proviene de algoritmos adecuados, buen diseño de objetos, arquitectura de programa inteligente, etc.
Afeitar un ciclo o dos con para los bucles vs mientras que los bucles NUNCA harán que un programa lento sea lento, o un programa rápido lento.
Si desea mejorar el rendimiento del programa en esta sección, encuentre la manera de desenrollar parcialmente el bucle (consulte Duff's Device) o mejore el rendimiento de lo que se hace dentro del bucle.
¿Puede proporcionar fuentes y citas para optimizar la longitud de levantamiento? – Krythic
@Krythic acaba de tropezar con esto: https://codeblog.jonskeet.uk/2009/01/29/for-vs-foreach-on-arrays-and-lists/ entrada de blog de Jon Skeet. – NoxMortem
NoxMortem Gracias – Krythic