Me han dicho que hay una diferencia de rendimiento entre los siguientes bloques de código.

foreach (Entity e in entityList)
{
 ....
}

y

for (int i=0; i<entityList.Count; i++)
{
   Entity e = (Entity)entityList[i];
   ...
}

donde

List<Entity> entityList;

Yo no soy CLR esperar, pero por lo que puedo decir de ellos debe reducen, básicamente, el mismo código. ¿Alguien tiene el hormigón (diablos, me gustaría tener mucha suciedad) evidencia de una manera o de la otra?

OriginalEl autor Craig | 2008-09-04

7 Comentarios

  1. 9

    foreach crea una instancia de un enumerador (volvió de GetEnumerator) y que enumerador también mantiene el estado en el supuesto de que el bucle foreach. Entonces llama repetidamente para la Next() del objeto en el enumerador y ejecuta su código para cada objeto que devuelve.

    Que no se reducen a un mismo código de cualquier manera, realmente, lo que verías si usted escribió su propia enumerador.

    OriginalEl autor Daniel Jennings

  2. 9

    Aquí es un buen artículo que muestra la IL diferencias entre los dos bucles.

    Foreach es técnicamente más lento pero mucho más fácil de usar y fácil de leer. A menos que el rendimiento es crítico prefiero el bucle foreach sobre el bucle for.

    El dnspy depurador – es muy útil para la depuración .NET en remoto de servidores web sin el código fuente – en la actualidad no va a entrar en un foreach-bucle utilizando F11 (VS2017 depurador m’) – y que puede ser un interruptor, esp. cuando foreach es más lento también. También, en algunos lenguajes como Javascript existen 2 variantes de foreach(por ejemplo, la matriz de &…) y el comportamiento de este último no siempre es tan intuitivo, que puede reducir significativamente «más fácil de usar y más fácil de leer» el beneficio.

    OriginalEl autor David Basarab

  3. 6

    El foreach de la muestra se corresponde aproximadamente con este código:

    using(IEnumerator<Entity> e = entityList.GetEnumerator()) {
        while(e.MoveNext()) {
            Entity entity = e.Current;
            ...
        }
    }

    Hay dos tipos de costos de aquí que una regular para el bucle no tiene que pagar:

    1. El costo de asignar el objeto enumerador por entityList.GetEnumerator().
    2. El costo de los dos métodos virtuales llamadas (MoveNext y Actual) para cada elemento de la lista.

    OriginalEl autor

  4. 3

    Un punto perdido aquí:
    Una Lista tiene un Recuento de la propiedad, que internamente realiza un seguimiento de cuántos elementos hay en ella.

    Un IEnumerable NO.

    Si usted programa para la interfaz IEnumerable y utilizar el recuento de extensión método enumerar sólo para contar los elementos.

    Un punto discutible, aunque ya en el IEnumerable usted no puede referirse a los elementos por su índice.

    Así que si usted desea bloquear en las Listas y Matrices usted puede conseguir pequeños incrementos de rendimiento.

    Si quieres flexibilidad de uso de foreach y programa de IEnumerable. (permitiendo el uso de linq y/o rendimiento).

    OriginalEl autor Brian Leahy

  5. 0

    Creo que una posible situación en la que podría obtener una ganancia de rendimiento es si el enumerable tipo del tamaño y la condición de bucle es una constante; por ejemplo:

    const int ArraySize = 10;
    int[] values = new int[ArraySize];
    
    //...
    
    for (int i = 0; i 

    In this case, depending on the complexity of the loop body, the compiler might be able to replace the loop with inline calls. I have no idea if the .NET compiler does this, and it's of limited utility if the size of the enumerable type is dynamic.

    One situation where foreach podría realizar mejor es con estructuras de datos como una lista enlazada donde de acceso aleatorio significa que atraviesa la lista; el enumerador utilizado por foreach probablemente recorrer un elemento a la vez, haciendo que cada acceso O(1) y el bucle completo O(n), pero llamando el indizador significa empezando por la cabeza y encontrar el elemento en el índice derecho; O(N) en cada bucle de O(n^2).

    Personally I don't usually worry about it and use foreach cualquier momento necesito todos los elementos y no se preocupan por el índice del elemento. Si no estoy trabajando con todos los elementos o realmente necesito saber el índice, yo la uso para. La única vez que pude ver que es una gran preocupación es con estructuras como listas enlazadas.

    OriginalEl autor OwenP

  6. 0
    For Loop
    for loop is used to perform the opreration n times
    for(int i=0;i<n;i++)
    {
    l=i;
    }
    foreach loop
    
    int[] i={1,2,3,4,5,6}
    foreach loop is used to perform each operation value/object in IEnumarable 
    foreach(var k in i)
    {
    l=k;
    }

    OriginalEl autor kavitha Reddy

Dejar respuesta

Please enter your comment!
Please enter your name here