Kısa bir süre önce LINQ kullanmaya başladım ve LINQ yöntemlerinden herhangi biri için çalışma zamanı karmaşıklığından gerçekten bahsetmedim. Açıkçası, burada rol oynayan birçok faktör var, bu yüzden tartışmayı basit IEnumerable
LINQ-to-Objects sağlayıcısıyla sınırlayalım . Ayrıca, Func
seçici / mutatör / vb. Olarak geçirilenlerin ucuz bir O (1) işlemi olduğunu varsayalım .
Her şey tek geçişli işlemler (yani açık görünüyor Select
, Where
, Count
, Take/Skip
, Any/All
bunlar sadece bir kez diziyi yürümek gerekiyor çünkü, vs.), O (n) olacaktır; Bu bile tembellik olsa da.
Daha karmaşık işlemler için işler daha belirsizdir; set gibi operatörler ( Union
, Distinct
, Except
vb) kullanılarak iş GetHashCode
varsayılan olarak (afaik), bunların genel olarak sıra bu işlemler O (n) yapım içten bir karma-tablo kullanıyorsanız varsaymak makul görünmektedir böylece. Peki ya bir kullanan sürümler IEqualityComparer
?
OrderBy
bir sıralamaya ihtiyaç duyar, bu yüzden büyük olasılıkla O (n log n) 'ye bakıyoruz. Ya zaten sıralanmışsa? OrderBy().ThenBy()
Her ikisine de aynı anahtarı söyleyip sağlasam nasıl olur ?
Sıralama veya karma kullanarak GroupBy
(ve Join
) görebiliyordum . Hangisi?
Contains
a üzerinde O (n) List
, ancak a üzerinde O (1) olur HashSet
- LINQ, işleri hızlandırıp hızlandıramayacağını görmek için temeldeki kapsayıcıyı kontrol ediyor mu?
Ve asıl soru - şimdiye kadar, operasyonların başarılı olduğuna inanıyorum. Ancak, buna güvenebilir miyim? Örneğin STL konteynerleri, her işlemin karmaşıklığını açıkça belirtir. .NET kitaplığı belirtiminde LINQ performansına ilişkin benzer garantiler var mı?
Daha fazla soru (yorumlara yanıt olarak):
Genel giderler hakkında gerçekten düşünmemiştim, ancak basit Linq-to-Objects için çok fazla şey olmasını beklemiyordum. CodingHorror yazısı, sorguyu ayrıştırmanın ve SQL yapmanın maliyet katacağını anlayabildiğim Linq-to-SQL'den bahsediyor - Objects sağlayıcısı için de benzer bir maliyet var mı? Öyleyse, bildirime dayalı veya işlevsel sözdizimini kullanıyorsanız farklı mıdır?