2016-08-30 9 views
5

संग्रह को IEnumerable.Last() (LINQ) पर कॉल करने के लिए यह पता लगाने के लिए .NET कोर स्रोत पर एक नज़र डाली गई थी कि संग्रह IList लागू करता है, जिसे मुझे कुछ त्वरित बेंचमार्किंग के बाद मामला होने का संदेह है। It turns out that yes, the input is specifically checked for IList, हालांकि, इससे पहले भी, यह जांच की जाती है कि इनपुट IPartition लागू करता है या नहीं। IPartition is defined here, लेकिन मुझे यह समझ में नहीं आता कि यह क्या करना है।.NET कोर में आईपर्टिशन क्या करता है?

IPartition का उद्देश्य क्या है और कैसे यह संभवतः IList का आमतौर पर निरंतर बार अनुक्रमण की तुलना में तेजी (या अगर यह नहीं है, यही कारण है कि इनपुट IPartition के लिए पहले IList से चेक किया गया है) हो सकता है?

+0

ऐसा लगता है कि डेटा का सबसेट बनाने के लिए 'टेक' जैसी विधियों द्वारा उपयोग किया जाता है। ध्यान रखें कि 'IQueryable' और इसी तरह का उपयोग करते समय डेटा पूरी तरह से लोड होने से पहले कई linq विधियों को बुलाया जा सकता है। 'आईपर्टिशन' के लिए जांच करने से कुछ चुस्त अनुकूलन की अनुमति मिल सकती है। –

उत्तर

4

यह सूचकांक के लिए समर्थन होने पर सूचकांक (टेक/छोड़ें और अन्य) पर कार्य करने योग्य संख्याओं के लिए एक अनुकूलन है। IIListProvider संबंधित है।

कुछ implementations हैं। IPartition के लिए फ़ाइल खोजें।

इस बारे में issues हैं।

IPartition अंतर्निहित संग्रह में उच्च स्तर के संचालन को प्रतिनिधि करने की अनुमति देता है। उदाहरण के लिए, new int[10].Skip(1) धीमा है क्योंकि सभी डेटा दो IEnumerable<int> के माध्यम से चलाता है। IPartition कार्यान्वयन के साथ यह प्रभावी रूप से for (int i = 1 ... 9) emit(list[i]); में बदल जाता है। तो यह इंटरमीडिएट एन्युमेटर का उपयोग नहीं कर रहा है और यह सूची सूचकांक को कॉल कर रहा है जो गणना से थोड़ा तेज है।

यह एक बहुत ही मोटा वर्णन है। मैं आपको गितूब चर्चाओं और कोड को देखने के लिए प्रोत्साहित करता हूं।