2010-02-27 7 views
7

क्या ऑब्जेक्ट ऑप्टिमाइज़ेशन तकनीकों का LINQ आप जंगली में उपयोग करते हैं या आपने देखा है?LINQ से ऑब्जेक्ट ऑप्टिमाइज़ेशन तकनीकें?

201x में सी # में आने के लिए "उपज फोरैच" और अन्य भाषा/कंपाइलर अनुकूलन की प्रतीक्षा करते समय, मैं प्रदर्शन प्रदर्शन के कम से कम LINQ का उपयोग करने के लिए हर संभव प्रयास करने में दिलचस्प हूं।

एक पैटर्न जिसे मैंने अब तक देखा है, विशिष्ट संयोजकों के लिए कस्टम आईनेमरेबल कार्यान्वयन बना रहा है जैसे कि संख्यात्मक को कई बार फिर से समझा नहीं जा रहा है।

+0

"विशिष्ट संयोजकों के लिए कस्टम आईनेमरेबल कार्यान्वयन बनाना, जैसे कि संख्यात्मक को कई बार फिर से गणना नहीं किया जा रहा है" -> 'ToArray' के सामरिक उपयोग, निश्चित रूप से? –

+0

ToArray हमेशा जवाब नहीं है। उदाहरण के लिए एक पुनरावर्ती परिदृश्य में। –

उत्तर

10

एक यह है कि मैं कई बार देखा गया है - का उपयोग नहीं करते:

if (query.Count() > 0) 

... इस के बजाय का उपयोग करें:

if (query.Any()) 

इस तरह यह केवल पहला मैच खोजने के लिए की जरूरत है ।

संपादित करें: आप यह भी अनुकूलन जो वस्तुओं के लिए LINQ में हो सकता है लेकिन नहीं कर रहे हैं (या .NET 3.5 में नहीं थे) के बारे में blog post I recently wrote में रुचि हो सकती।

साथ ही, आपको x.Contains(y) संचालन और x का एक बहुत करने के लिए जा रहे हैं तो मौजूदा क्वेरी का परिणाम (यानी यह पहले से ही कुछ अनुकूलित संग्रह होने जा रहा नहीं है), तो आप शायद करने के लिए x से एक HashSet<T> के निर्माण पर विचार करना चाहिए प्रत्येक पुनरावृत्ति पर एक रैखिक स्कैन से बचें (x के परिणाम उत्पन्न करने के लिए क्वेरी निष्पादित करें)।

+0

यह एक उत्कृष्ट टिप है! –

+0

निश्चित रूप से कोई भी गणना से कहीं बेहतर है। मैंने बस बीसीएल 4 और एलिमेंट को अलग किया है अब इसे ILists के लिए अनुकूलित किया गया है; यह उस मामले में एक साधारण सूची [अनुक्रमणिका] लुकअप करता है। –

+0

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