Saya baru-baru ini mulai menggunakan LINQ cukup banyak, dan saya belum benar-benar melihat adanya penyebutan kompleksitas run-time untuk salah satu metode LINQ. Jelas, ada banyak faktor yang berperan di sini, jadi mari kita batasi diskusi pada IEnumerable
penyedia LINQ-to-Objects biasa. Selanjutnya, mari kita asumsikan bahwa apapun yang Func
diteruskan sebagai selector / mutator / etc. adalah operasi O (1) yang murah.
Tampak jelas bahwa semua operasi tunggal-pass ( Select
, Where
, Count
, Take/Skip
, Any/All
, dll) akan menjadi O (n), karena mereka hanya perlu berjalan urutan sekali; meskipun ini pun tunduk pada kemalasan.
Segalanya lebih suram untuk operasi yang lebih kompleks; set-seperti operator ( Union
, Distinct
, Except
, dll) bekerja menggunakan GetHashCode
secara default (afaik), sehingga tampaknya masuk akal untuk mengasumsikan mereka menggunakan hash-table internal, membuat operasi ini O (n) juga, pada umumnya. Bagaimana dengan versi yang menggunakan IEqualityComparer
?
OrderBy
akan membutuhkan semacam, jadi kemungkinan besar kita sedang melihat O (n log n). Bagaimana jika sudah diurutkan? Bagaimana jika saya mengatakan OrderBy().ThenBy()
dan memberikan kunci yang sama untuk keduanya?
Saya bisa melihat GroupBy
(dan Join
) menggunakan penyortiran, atau hashing. Yang mana
Contains
akan menjadi O (n) pada a List
, tetapi O (1) pada a HashSet
- apakah LINQ memeriksa container yang mendasarinya untuk melihat apakah itu dapat mempercepat?
Dan pertanyaan sebenarnya - sejauh ini, saya percaya bahwa operasinya berjalan dengan baik. Namun, bisakah saya mengandalkan itu? Kontainer STL, misalnya, dengan jelas menetapkan kompleksitas setiap operasi. Apakah ada jaminan serupa pada kinerja LINQ dalam spesifikasi pustaka .NET?
Lebih banyak pertanyaan (dalam menanggapi komentar):
Tidak benar-benar memikirkan tentang overhead, tetapi saya tidak berharap ada banyak hal untuk Linq-to-Objects sederhana. Posting CodingHorror berbicara tentang Linq-to-SQL, di mana saya dapat memahami parsing kueri dan membuat SQL akan menambah biaya - apakah ada biaya yang sama untuk penyedia Objek juga? Jika demikian, apakah berbeda jika Anda menggunakan sintaks deklaratif atau fungsional?