मैंने हाल ही में LINQ का उपयोग करना शुरू किया है, और मैंने वास्तव में LINQ विधियों में से किसी के लिए रन-टाइम जटिलता का कोई उल्लेख नहीं देखा है। जाहिर है, यहां खेलने के कई कारक हैं, इसलिए आइए चर्चा को सादे IEnumerable
LINQ-to-Objects प्रदाता तक सीमित करें । इसके अलावा, मान लें कि Func
चयनकर्ता / उत्परिवर्ती / आदि के रूप में पारित किसी भी एक सस्ता ओ (1) ऑपरेशन है।
यह स्पष्ट है कि सभी एक-पास परिचालन (लगता है Select
, Where
, Count
, Take/Skip
, Any/All
, आदि) हे (एन) के बाद से वे केवल एक बार अनुक्रम चलने के लिए की जरूरत है हो जाएगा,; हालांकि यह भी आलस्य के अधीन है।
अधिक जटिल कार्यों के लिए चीजें मुखर हैं; सेट-जैसे ऑपरेटर ( Union
और Distinct
, Except
आदि) GetHashCode
डिफ़ॉल्ट (afaik) का उपयोग करके काम करते हैं , इसलिए यह मान लेना उचित है कि वे हैश-टेबल का आंतरिक रूप से उपयोग कर रहे हैं, जिससे ये ऑपरेशन O (n) के साथ-साथ सामान्य रूप से भी हो रहे हैं। उन संस्करणों के बारे में जो एक का उपयोग करते हैं IEqualityComparer
?
OrderBy
एक प्रकार की आवश्यकता होगी, इसलिए सबसे अधिक संभावना है कि हम ओ (एन लॉग एन) को देख रहे हैं। यदि यह पहले से ही हल है तो क्या होगा? कैसे के बारे में अगर मैं कहता हूं OrderBy().ThenBy()
और दोनों को एक ही कुंजी प्रदान करता हूं ?
मैं या तो छँटाई, या हैशिंग का उपयोग कर GroupBy
(और Join
) देख सकता था । यह किसका है?
Contains
हो सकता है O (n) a पर List
, लेकिन O (1) a HashSet
- पर LINQ अंतर्निहित कंटेनर की जांच करता है कि क्या वह चीजों को गति दे सकता है?
और असली सवाल - अब तक, मैं इसे विश्वास पर ले रहा हूं कि संचालन प्रदर्शन कर रहे हैं। हालांकि, क्या मैं उस पर बैंक कर सकता हूं? एसटीएल कंटेनर, उदाहरण के लिए, प्रत्येक ऑपरेशन की जटिलता को स्पष्ट रूप से निर्दिष्ट करते हैं। क्या .NET लाइब्रेरी विनिर्देश में LINQ प्रदर्शन पर कोई समान गारंटी है?
अधिक सवाल (टिप्पणियों के जवाब में):
वास्तव में ओवरहेड के बारे में नहीं सोचा था, लेकिन मुझे उम्मीद नहीं थी कि साधारण लिनक-टू-ऑब्जेक्ट्स के लिए बहुत कुछ होगा। कोडिंगहोरर पोस्ट लिनक-टू-एसक्यूएल के बारे में बात कर रहा है, जहां मैं क्वेरी को पार्स करने और एसक्यूएल बनाने की लागत को समझ सकता हूं - क्या ऑब्जेक्ट प्रदाता के लिए भी समान लागत है? यदि ऐसा है, तो क्या यह अलग है अगर आप घोषणात्मक या कार्यात्मक वाक्यविन्यास का उपयोग कर रहे हैं?