Какова эффективность и производительность выражения LINQ и Lambda в .Net?

Я использовал .Net 3.5 и VS 2008 более месяца. Как и большинство разработчиков .Net, я развился из многолетнего опыта работы в .NET 1.0 и 2.0 и VS 2005. Недавно я обнаружил простоту и мощь LINQ и Lambda Expressions, как в моих последних вопросах, таких как Найти элемент в списке по LINQ, Преобразовать или сопоставить экземпляр класса с списком другого с помощью Lambda или LINQ и Преобразуйте или сопоставьте список классов с другим списком классов с помощью Lambda или LINQ.

Я признаю, что Lambda и LINQ намного проще и легко читаются, и они кажутся очень мощными. За кулисами компилятор .Net должен генерировать много кода для достижения этих функций. Поэтому я немного не решаюсь переключиться на новый синтаксис, так как я уже знаю "старый" способ достижения тех же результатов.

Мой вопрос касается эффективности и производительности Lambda и LINQ. Может быть, лямбда-выражения - это в основном встроенные функции, в этом случае я думаю, что Лямбда должна быть в порядке. Как насчет LINQ?

Ограничьте обсуждение LINQ-to-SQL LINQ-to-SQL (LINQ-to-SQL). Любые комментарии, сравнение и опыт?

Ответ 1

Здесь нет ни одного ответа, который будет достаточно.

LINQ имеет множество применений и множество реализаций, и, следовательно, многие последствия для эффективности вашего кода.

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

Поэтому лучшим советом, который я могу вам дать, является ознакомление с тем, как LINQ действительно реализуется.

Вещи, которые вы должны проверить:

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

Ответ 2

Технически самым быстрым способом является контроль над всеми мелочами. Вот некоторые тесты производительности. Обратите внимание, что ключевое слово foreach и конструкция ForEach LINQ идентичны гораздо медленнее, чем просто использовать и записывать процедурный код.

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

Ответ 3

Для запросов LINQ с "новым синтаксисом" генерируемый IL (код) принципиально не отличается от вызова методов расширения, предоставляемых Enumerable и Queryable напрямую.

Ответ 4

Не оптимизируйте преждевременно. Используйте Linq и новые методы расширения, если они улучшат читаемость и профилируют ваше приложение впоследствии.

В большинстве случаев разница между Linq и использованием plain для циклов не имеет отношения вообще. Улучшенная ремонтопригодность вашего кода должна стоить несколько мс. Linq может быть медленнее, потому что он работает на счетчиках, которые реализованы как государственные машины. Так что простой (...) цикл будет быстрее.

Я бы посоветовал следовать совету Lasse V. Karlsens и добавить http://www.davesquared.net/2009/07/enumerables-linq-and-speed.html в свой список ссылок.

Ответ 5

Не существует разницы в производительности между запросами LINQ и выражениями Lambda.

Вы должны полностью понять, как функция LINQ (как Lambda, LINQ-запросы) работает в .NET, прежде чем вы смотрите на проблемы с производительностью.

В принципе, вы можете работать с любым из запросов LINQ и Lambda.

Запросы LINQ

  • Это читаемый пользователем запрос высокого уровня.

  • Он преобразуется в равную Лямбду выражения и Лямбда-выражения, добавленные как узлы в дерево выражений. Дерево выражений что делает структуру лямбда-выражений. Это сделанный компилятором.

  • Поставщик запросов просматривает выражения (добавленные как узлы в дереве выражений) и создает равномерные SQL-запросы, таким образом, равный sql-запрос, сформированный во время во время выполнения.

  • Тип возврата: набор результатов (IEnumerable).

Лямбда-выражения

  • Это набор выражений/операторов и создает делегат/ дерево выражений. Оно может передаваться функции как аргумент.

  • Он поддерживает все методы LINQ, такие как запросы LINQ. (Где, Select, Count, Sum и т.д.)

  • Создано дерево выражений, которое делает структуру лямбда выражения. Это делается путем компилятор.

  • Поставщик запросов просматривает выражения (дерево выражений) и создает равномерный SQL-запрос во время во время выполнения.

  • Тип возврата: Delagate/ Дерево выражений

Что лучше?

Вы можете понять LINQ (запросы, лямбда). Если вы посмотрите на вышеуказанные пункты.

Преимущество запроса LINQ - доступно для чтения.

Преимущество Лямбды

  • У Lambda будет преимущество, так как он создает делегат и с помощью delagte вы можете просто пройти введите пареметры и получите результат для разных входных параметров. Вам не нужно писать разные запросы для разных также критерии.

  • Вы можете создать динамический запрос с использованием лямбда-выражений и Деревья выражений.

  • Вы можете использовать выражения Lambda, если вы хотите передать результат (ы) к методу как аргумент.

  • выражения короче.

Таким образом, выражение Lambda является лучшим для разработки по запросам LINQ.

Ответ 6

В некоторых случаях LINQ так же быстро, если не быстрее, чем другие методы, но в других случаях он может быть медленнее. Мы работаем над проектом, который мы преобразовали в linq, и поиск данных выполняется быстрее, но слияние данных между двумя таблицами происходит намного медленнее. Немного накладных расходов, но в большинстве случаев я не вижу разницы в скорости, которая сильно влияет на вашу программу.