Recientemente comencé a usar LINQ bastante, y realmente no he visto ninguna mención de la complejidad del tiempo de ejecución para ninguno de los métodos LINQ. Obviamente, hay muchos factores en juego aquí, así que limitemos la discusión al IEnumerable
proveedor simple de LINQ-to-Objects. Además, supongamos que cualquiera que se Func
pase como selector / mutador / etc.es una operación barata de O (1).
Parece obvio que todas las operaciones de un solo paso ( Select
, Where
, Count
, Take/Skip
, Any/All
, etc.) serán O (n), ya que sólo tienen que caminar la secuencia de una vez; aunque incluso esto está sujeto a la pereza.
Las cosas son más turbias para las operaciones más complejas; la puesta a punto como operadores ( Union
, Distinct
, Except
, etc.) mediante el trabajo GetHashCode
por defecto (que yo sepa), por lo que parece razonable suponer que están utilizando una tabla hash interna, haciendo que estas operaciones O (n), así, en general. ¿Qué pasa con las versiones que usan un IEqualityComparer
?
OrderBy
necesitaría una especie, por lo que lo más probable es que estemos mirando O (n log n). ¿Y si ya está ordenado? ¿Qué tal si digo OrderBy().ThenBy()
y proporciono la misma clave para ambos?
Pude ver GroupBy
(y Join
) usar clasificación o hash. Cual es
Contains
sería O (n) en a List
, pero O (1) en a HashSet
- ¿LINQ verifica el contenedor subyacente para ver si puede acelerar las cosas?
Y la verdadera pregunta: hasta ahora, lo he estado tomando con fe en que las operaciones están funcionando. Sin embargo, ¿puedo contar con eso? Los contenedores STL, por ejemplo, especifican claramente la complejidad de cada operación. ¿Existen garantías similares sobre el rendimiento de LINQ en la especificación de la biblioteca .NET?
Más pregunta (en respuesta a los comentarios):
Realmente no había pensado en la sobrecarga, pero no esperaba que hubiera mucho para Linq-to-Objects simples. La publicación CodingHorror está hablando de Linq-to-SQL, donde puedo entender que analizar la consulta y hacer que SQL agregue un costo: ¿también hay un costo similar para el proveedor de Objetos? Si es así, ¿es diferente si usa la sintaxis declarativa o funcional?