Niedawno zacząłem używać LINQ całkiem sporo i tak naprawdę nie widziałem żadnej wzmianki o złożoności czasu wykonywania żadnej z metod LINQ. Oczywiście w grę wchodzi wiele czynników, więc ograniczmy dyskusję do zwykłego IEnumerable
dostawcy LINQ-to-Objects. Dalej, załóżmy, że każda Func
przekazana jako selektor / mutator / itp. Jest tanią operacją O (1).
Jest oczywiste, że wszystkie te operacje są jedno-przepływowe ( Select
, Where
, Count
, Take/Skip
, Any/All
, etc.), można O (N), ponieważ wystarczy chodzić sekwencję raz; chociaż nawet to podlega lenistwu.
W przypadku bardziej złożonych operacji sytuacja jest bardziej mętna; zestaw podobny operatorów ( Union
, Distinct
, Except
, itd.), praca przy użyciu GetHashCode
domyślnie (AFAIK), więc wydaje się rozsądne, aby założyć, że używasz hash-table wewnętrznie, co czyni te operacje O (n), jak również, w ogóle. A co z wersjami, które używają IEqualityComparer
?
OrderBy
potrzebowałby sortowania, więc najprawdopodobniej patrzymy na O (n log n). A jeśli jest już posortowane? A jeśli powiem OrderBy().ThenBy()
i podam ten sam klucz do obu?
Widziałem GroupBy
(i Join
) używając sortowania lub mieszania. Który to jest?
Contains
byłoby O (n) na a List
, ale O (1) na a HashSet
- czy LINQ sprawdza podstawowy kontener, aby sprawdzić, czy może przyspieszyć działanie?
I prawdziwe pytanie - do tej pory wierzyłem, że operacje są skuteczne. Czy mogę jednak na to liczyć? Na przykład kontenery STL jasno określają złożoność każdej operacji. Czy istnieją podobne gwarancje wydajności LINQ w specyfikacji biblioteki .NET?
Więcej pytań (w odpowiedzi na komentarze): Tak
naprawdę nie myślałem o narzutach, ale nie spodziewałem się, że będzie wiele dla prostych Linq-to-Objects. W poście CodingHorror jest mowa o Linq-to-SQL, w którym rozumiem, że analizowanie zapytania i tworzenie SQL zwiększyłoby koszty - czy dostawca obiektów ma podobny koszt? Jeśli tak, czy jest inaczej, jeśli używasz składni deklaratywnej lub funkcjonalnej?