Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Операции запросов и операции с осями часто реализуются для использования отложенного выполнения. В этой статье описываются требования и преимущества отложенного выполнения, а также некоторые рекомендации по реализации.
Отложенное выполнение
Отложенное выполнение означает, что оценка выражения задерживается до тех пор, пока не требуется его реализованное значение. Отложенное выполнение может значительно повысить производительность при работе с большими коллекциями данных, особенно в программах, содержащих ряд цепочки запросов или манипуляций. В лучшем случае отложенное выполнение включает только одну итерацию через исходную коллекцию.
Технологии LINQ используют широкое использование отложенного выполнения как в членах основных System.Linq классов, так и в методах расширения в различных пространствах имен LINQ, таких как System.Xml.Linq.Extensions.
Отложенное выполнение поддерживается непосредственно на языке C# ключевым словом (в виде инструкции yield-return
) при использовании в блоке итератора. Такой итератор должен возвращать коллекцию типов IEnumerator или IEnumerator<T> (или производный тип).
Охотное и ленивое вычисление
При написании метода, реализующего отложенное выполнение, также необходимо решить, следует ли реализовать метод с помощью отложенной оценки или активной оценки.
- При отложенной оценке один элемент исходной коллекции обрабатывается во время каждого вызова итератора. Это типичный способ реализации итераторов.
- При активной оценке первый вызов итератора приведет ко всей обработке коллекции. Также может потребоваться временная копия исходной коллекции. Например, OrderBy метод должен отсортировать всю коллекцию, прежде чем он возвращает первый элемент.
Ленивая оценка обычно дает более высокую производительность, так как равномерно распределяет обработку в течение выполнения оценки коллекции и сводит к минимуму использование временных данных. Конечно, для некоторых операций нет другого варианта, кроме материализации промежуточных результатов.
См. Пример отложенного выполнения для примера программирования отложенного выполнения в C# и Visual Basic.