2010-11-24 10 views
5

मैंने कुछ संग्रह वस्तुओं (शब्दकोश, सूची) के खिलाफ लिंक का उपयोग किया है। इसलिए यदि मैं मानदंडों के आधार पर आइटम चुनना चाहता हूं तो मैं एक लिंक क्वेरी लिखता हूं और फिर linq ऑब्जेक्ट को गिनती करता हूं। तो मेरा सवाल यह है कि लिंक मुख्य संग्रह को लूपिंग को समाप्त कर रहा है और परिणामस्वरूप प्रदर्शन में सुधार हुआ है?क्या LINQ लूपिंग को समाप्त करके प्रदर्शन को बढ़ाता है?

+8

LINQ जादू नहीं है। –

+6

मैंने देखा कि किसी ने एक टोपी से एक IENumerable खींच लिया ..... –

उत्तर

8

बिलकुल नहीं। LINQ से ऑब्जेक्ट्स आंतरिक रूप से loops - यह और कैसे काम कर सकता है?

दूसरी ओर, LINQ अधिक कुशल कुछ दृष्टिकोण से आप ले सकता है, डेटा आदि तीसरे ओर स्ट्रीमिंग केवल जब यह आवश्यक है

से है, यह अविवेक की अतिरिक्त परतों (शामिल सभी इटरेटर आदि) जो प्रदर्शन पर कुछ मामूली प्रभाव डालेगा।

+10

आह! मैं जानता था * आपके पास तीन हाथ थे। –

+0

तो मुझे लगता है कि लिंक-टू-ऑब्जेक्ट्स 'असामान्य' परिदृश्यों में अक्षम हैं। – NLV

+0

ओह गौड ... यह फिर से नहीं। @ एनएलवी, आप अक्षम कैसे मात्राबद्ध करते हैं? यह देखते हुए कि कोडर समय में हार्डवेयर (यहां तक ​​कि किराए पर हार्डवेयर) और अधिक समय की बचत होती है जो लिंक प्रदान करता है ... इस तथ्य के साथ-साथ आमतौर पर लगभग 9 0% कोड का प्रदर्शन गैर-प्रदर्शन महत्वपूर्ण होता है, मैं कहूंगा कि इसका उपयोग नहीं कर रहा है linq अक्षम है। – spender

2

समस्या नहीं है। LINQ खुद को terse (उम्मीद है) पठनीय कोड करने के लिए उधार देता है।

कवर के तहत यह लूपिंग है, जब तक बैकिंग डेटा संरचना स्कैनिंग से अधिक कुशल खोज एल्गोरिदम का समर्थन नहीं करती है।

+0

"जब तक बैकिंग डेटा संरचना स्कैनिंग की तुलना में अधिक कुशल खोज एल्गोरिदम का समर्थन नहीं करती है" - यह सामान्य रूप से सत्य नहीं है, जब तक कि अनुकूलन * विशेष रूप से * उस क्वेरी ऑपरेटर में बनाया गया न हो। उदाहरण के लिए, जहां तक ​​मुझे पता है, 'Skip' को सूचियों के लिए अनुकूलित नहीं किया गया है। और वर्तमान में किसी संग्रह के लिए ऑब्जेक्ट क्वेरी में LINQ "हुक" करने का कोई तरीका नहीं है। – Ani

+2

जैसा कि मैंने कहा "जब तक ..." –

+0

मेरा मुद्दा यह है कि बैकिंग डेटा संरचना * इसका समर्थन कर सकती है, लेकिन LINQ से ऑब्जेक्ट्स इस समर्थन का उपयोग नहीं कर सकते हैं। – Ani

2

नहीं, वास्तव में यदि आप LINQ से SQL का उपयोग कर रहे हैं, तो प्रदर्शन थोड़ा खराब होगा क्योंकि LINQ ado.net स्टैक के शीर्ष पर एक अतिरिक्त परत है।

यदि आप वस्तुओं पर linq का उपयोग कर रहे हैं। linq द्वारा किए गए अनुकूलन हैं, सबसे महत्वपूर्ण एक "यील्ड" है जो उत्पन्न होने के बाद एक आईनेमरेबल से परिणाम उत्पन्न करना शुरू कर देता है। जो मानक दृष्टिकोण से बेहतर है, जिसे भरने के लिए एक सूची की प्रतीक्षा करनी है और इसे फिर से चालू करने के लिए फ़ंक्शन द्वारा लौटाया गया है।

+0

LINQ से SQL: जब तक दोनों प्रश्न समान होते हैं तब तक सत्य होता है। यदि आप फ़िल्टरिंग करने के लिए ऑब्जेक्ट्स के लिए LINQ का उपयोग करके सबकुछ वापस खींच रहे हैं, तो यह धीमा हो सकता है। LINQ से ऑब्जेक्ट्स: यदि आपके पास पहले से ही एक प्री-भरी सूची है, तो यह तेज़ नहीं होगा। यह सब वास्तव में दृश्यों के पीछे क्या चल रहा है इस पर निर्भर करता है। –

1

जब आप सीधे क्वेरी का उपयोग करते हैं, तो आप अभी भी पूरे संग्रह पर लूप करते हैं। आप बस सब कुछ नहीं देखते हैं, क्योंकि क्वेरी केवल आपके फ़िल्टर से मेल खाने वाले तत्वों को वापस कर देगी। कुल प्रदर्शन शायद उन हिट किए गए इटरेटर्स की वजह से भी हिट लेगा। जब आपने अपने क्वेरी परिणाम पर ToList() को बुलाया, और फिर इस परिणाम का कई बार उपयोग किया, तो आप प्रदर्शन के अनुसार बेहतर होंगे।

संबंधित मुद्दे