Я совсем недавно начал использовать LINQ, и я действительно не встречал упоминания о сложности времени выполнения для любого из методов LINQ. Очевидно, здесь играет роль множество факторов, поэтому давайте ограничимся обсуждением простого IEnumerable
поставщика LINQ-to-Objects. Далее, давайте предположим, что любой Func
переданный в качестве селектора / мутатора / т. Д. Является дешевой операцией O (1).
Представляется очевидным , что все операции за один проход ( Select
, Where
, Count
, Take/Skip
, Any/All
и т.д.) будет O (п), так как они только должны пройти последовательность один раз; хотя даже это подвержено лени.
Для более сложных операций дела обстоят еще мрачнее; множество подобных операторов ( Union
, Distinct
, Except
и т.д.) работы с использованием GetHashCode
по умолчанию (AFAIK), так что кажется разумным предположить , что они используют хэш-таблицу внутри, что делает эти операции O (п), а также , в целом. А как насчет версий, в которых используется IEqualityComparer
?
OrderBy
потребуется сортировка, поэтому, скорее всего, мы смотрим на O (n log n). Что делать, если он уже отсортирован? Как насчет того, чтобы я сказал OrderBy().ThenBy()
и предоставил один и тот же ключ обоим?
Я мог видеть GroupBy
(и Join
) использовать либо сортировку, либо хеширование. Что это?
Contains
будет O (n) на a List
, но O (1) на a HashSet
- проверяет ли LINQ базовый контейнер, чтобы узнать, может ли он ускорить работу?
И реальный вопрос - до сих пор я полагаю, что операции производительны. Однако могу ли я на это рассчитывать? Например, контейнеры STL четко определяют сложность каждой операции. Есть ли аналогичные гарантии производительности LINQ в спецификации библиотеки .NET?
Еще вопрос (в ответ на комментарии): на
самом деле не думал об накладных расходах, но я не ожидал, что будет много простых Linq-to-Objects. В сообщении CodingHorror говорится о Linq-to-SQL, где я могу понять, что синтаксический анализ запроса и создание SQL увеличат стоимость - есть ли аналогичная стоимость для поставщика объектов? Если да, то отличается ли это от использования декларативным или функциональным синтаксисом?