Udostępnij za pomocą


Odroczone wykonywanie i leniwa ewaluacja (LINQ to XML)

Operacje na zapytaniach i osiach są często implementowane w celu wykonania z odroczeniem. W tym artykule wyjaśniono wymagania i zalety odroczonego wykonywania oraz niektóre zagadnienia dotyczące implementacji.

Odroczone wykonanie

Odroczone wykonanie oznacza, że ocena wyrażenia jest opóźniona, dopóki nie zostanie rzeczywiście wymagana jego zrealizowana wartość. Odroczone wykonywanie może znacznie poprawić wydajność, gdy trzeba manipulować dużymi kolekcjami danych, zwłaszcza w programach zawierających serię zapytań łańcuchowych lub manipulacji. W najlepszym przypadku odroczone wykonanie umożliwia tylko pojedynczą iterację za pośrednictwem kolekcji źródłowej.

Technologie LINQ korzystają w dużym stopniu z wykonywania odroczonego zarówno w składowych klas podstawowych System.Linq, jak i w metodach rozszerzeń w różnych przestrzeniach nazw LINQ, takich jak System.Xml.Linq.Extensions.

Wykonywanie odroczone jest obsługiwane bezpośrednio w języku C# przez słowo kluczowe yield (odniesienie C#) (w postaci instrukcji yield-return) podczas użycia w bloku iteratora. Taki iterator musi zwrócić kolekcję typu IEnumerator lub IEnumerator<T> (lub typu pochodnego).

Ocena chętna kontra leniwa

Pisząc metodę, która implementuje odroczone wykonanie, musisz również zdecydować, czy zaimplementować metodę przy użyciu opóźnionej ewaluacji, czy natychmiastowej ewaluacji.

  • W leniwej ewaluacji pojedynczy element kolekcji źródłowej jest przetwarzany przy każdym wywołaniu iteratora. Jest to typowy sposób implementacji iteratorów.
  • W celu wyczekiwanej oceny pierwsze wywołanie iteratora spowoduje przetworzenie całej kolekcji. Może być również wymagana tymczasowa kopia kolekcji źródłowej. Na przykład OrderBy metoda musi posortować całą kolekcję, zanim zwróci pierwszy element.

Leniwe przetwarzanie zwykle daje lepszą wydajność, ponieważ równomiernie rozkłada obciążenie w czasie przetwarzania kolekcji i minimalizuje użycie danych tymczasowych. Oczywiście w przypadku niektórych operacji nie ma innej opcji niż materializowanie wyników pośrednich.

Zobacz Przykład odroczonego wykonywania , aby zapoznać się z przykładem odroczonego wykonywania programowania w językach C# i Visual Basic.

Zobacz także