2009-02-16 39 views

Respuesta

46

(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.Lengthen 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 ...

+0

¿Puede proporcionar fuentes y citas para optimizar la longitud de levantamiento? – Krythic

+0

@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

+0

NoxMortem Gracias – Krythic

2

Ninguno de los dos. Ellos son equivalentes. Puede pensar que el bucle 'for' es una forma más compacta de escribir el while-loop.

12

Yo diría que son lo mismo y nunca debería hacer tales micro-optimizaciones de todos modos.

-1

Sí, son fragmentos de código equivalentes.

6

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.

3

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.