2008-11-16 7 views
19

Zastanawiam się, czy istnieje jakakolwiek współbieżność (teraz lub w przyszłości) lub korzyści związane z wydajnością korzystania z zwrotu z inwestycji w przypadku zwracania listy. Poniżej przedstawiono kilka przykładówWspółbieżność lub wydajność Korzyści z zwrotu plonu z powodu zwrotu listy

metoda przetwarzania

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

pomocą cofnięcie Wydajność

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

powrocie listę

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

Byłoby zabawa do debugowania blok iterator ('yield'), który jest inicjowany leniwie (' 'Lazy ) i asynchronosly (' async') wykonywany :) – nawfal

Odpowiedz

39

W przykładzie yield return wynik oceniano w każdym wywołaniu IEnumerable.MoveNext natomiast w przykładzie listy wszystkie wyniki są ocenione przed zwróceniem IEnumerable (należy zauważyć, że właściwości Text mogą nie być oceniane dla każdego wyniku, ponieważ może wystąpić buforowanie i wstawianie). Dlatego w przypadku yield return powinieneś uzyskać niewielkie ulepszenie wydajności podczas pierwszego połączenia z modułem wyliczającym, a następnie potencjalnie niewielki spadek wydajności podczas każdego kolejnego wywołania do IEnumerable.MoveNext, gdy właściwość jest oceniana.

Jedną z wspaniałych rzeczy na temat yield return jest to, że możesz zwracać nieskończone sekwencje, losowe sekwencje i wszelkiego rodzaju inne wyliczenia, które byłyby albo niezwykle nieskuteczne, albo niemożliwe do zrobienia z modelem tworzenia listy jako pierwszej.

Mówiąc prościej, wracając wystąpienie List wymaga, aby wszystkie elementy na liście są oceniane przed zwróceniem IEnumerable, natomiast używając yield return pozwala każdy element należy obliczać jak to jest wymagane przez konsumenta w IEnumerable.

+0

Więc dla małych list powiedzieć pod 20 pozycji polecacie powrocie tylko lista. – bendewey

+4

Zależałoby od tego, jakie elementy listy były i ile wysiłku potrzebnego do oceny każdej wartości. Gdyby każdy element na liście wymagał otwarcia pliku o wielkości 500 MB, to szukałbym metod zwrotu plonów, gdyby były to tylko proste obliczenia, lista prawdopodobnie byłaby lepsza. –

+0

+1 Świetna odpowiedź - dzięki – Guy

Powiązane problemy