2008-11-16 6 views
19

Me preguntaba si hay concurrencia (actual o futura), o beneficio en el rendimiento al usar rendimiento devuelto sobre la devolución de una lista. Ver los siguientes ejemplosSimultaneidad o rendimiento Beneficios del rendimiento sobre la devolución de una lista

Procesamiento Método

void Page_Load() 
{ 
    foreach(var item in GetPostedItems()) 
    Process(item); 
} 

usando retorno rendimiento

IEnumerable<string> GetPostedItems() 
{ 
    yield return Item1.Text; 
    yield return Item2.Text; 
    yield return Item3.Text; 
} 

devolviendo una lista

IEnumerable<string> GetPostedItems() 
{ 
    var list = new List<string>(); 
    list.Add(Item1.Text); 
    list.Add(Item2.Text); 
    list.Add(Item3.Text); 
    return list; 
} 
+0

Sería divertido depurar un bloque iterador ('yield') que se inicializó con pereza (' Lazy 'y asynchronosly (' async') ejecutado :) – nawfal

Respuesta

39

En el ejemplo yield return, el resultado es evaluado en cada llamada de IEnumerable.MoveNext mientras que en el ejemplo de lista, todos los resultados son evaluado antes de que se devuelva el IEnumerable (tenga en cuenta que las propiedades Text no se pueden evaluar para cada resultado, ya que puede producirse el almacenamiento en caché y la alineación interna). Por lo tanto, con yield return, debe obtener una pequeña mejora de rendimiento en la primera llamada al enumerador y, luego, potencialmente una pequeña disminución de rendimiento en cada llamada posterior al IEnumerable.MoveNext a medida que se evalúa la propiedad.

Una de las mejores cosas de yield return es que puede devolver secuencias infinitas, secuencias aleatorias y todo tipo de enumeraciones nuevas que serían extremadamente ineficaces o imposibles de hacer con el modelo de creación de una lista primero.

para decirlo simplemente, volviendo una instancia de List requiere que todos los elementos de la lista son evaluados antes de devolver el IEnumerable, mientras que el uso de yield return permite que cada elemento que se calcula como se requiere por el consumidor de la IEnumerable.

+0

Por lo tanto, para listas pequeñas, decir menos de 20 elementos ¿recomendaría devolver solo un lista. – bendewey

+4

Depende de los elementos de la lista y del esfuerzo que se requiera para evaluar cada valor. Si cada elemento de la lista implicara abrir un archivo de 500MB, entonces buscaría los enfoques de retorno de rendimiento, si fuera solo un cálculo simple, la lista probablemente sería mejor. –

+0

+1 Gran respuesta: gracias – Guy

Cuestiones relacionadas