Повышает ли LINQ производительность, устраняя циклы? - PullRequest
5 голосов
/ 24 ноября 2010

Я использовал Linq против некоторых объектов коллекции (Словарь, Список).Поэтому, если я хочу выбрать элементы на основе критериев, я пишу запрос Linq, а затем перечисляю объект linq.Итак, мой вопрос заключается в том, что Linq устраняет зацикливание основной коллекции и, как результат, повышает производительность?

Ответы [ 4 ]

8 голосов
/ 24 ноября 2010

Абсолютно нет. Внутренние циклы LINQ to Objects - как еще это может работать?

С другой стороны, LINQ является более эффективным, чем некоторые подходы, которые вы могли бы использовать, путем потоковой передачи данных только тогда, когда это необходимо и т. Д.

С третьей стороны, он включает в себя дополнительные уровни косвенности (все итераторы и т. Д.), Что окажет некоторое незначительное влияние на производительность.

2 голосов
/ 24 ноября 2010

Проббалы нет. LINQ поддается краткому (надеюсь) читабельному коду.

Под прикрытием он зацикливается, если структура вспомогательных данных не поддерживает более эффективный алгоритм поиска, чем сканирование.

1 голос
/ 24 ноября 2010

Когда вы используете запрос напрямую, вы все равно зацикливаетесь на всей коллекции.Вы просто не видите всего, потому что запрос будет возвращать только те элементы, которые соответствуют вашему фильтру.Общая производительность, вероятно, даже пострадает, просто из-за всех этих вложенных итераторов.Когда вы вызываете ToList () для своего результата запроса, а затем используете этот результат несколько раз, вам будет лучше с точки зрения производительности.

1 голос
/ 24 ноября 2010

Нет, на самом деле, если вы используете LINQ to SQL, производительность будет немного хуже, поскольку LINQ, в конце концов, является дополнительным слоем поверх стека ado.net.

если вы используете linq поверх объектов. есть оптимизация, выполненная linq, наиболее важной из которых является «Yield», которая начинает генерировать результаты из IEnumerable по мере его генерирования. это лучше, чем стандартный подход, который должен ждать, пока список будет заполнен и возвращен функцией, чтобы перебрать его.

...