Я совсем недавно начал использовать 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 увеличат стоимость - есть ли аналогичная стоимость для поставщика объектов? Если да, то отличается ли это от использования декларативным или функциональным синтаксисом?