2016-04-16 7 views
10

मैं गिटहब पर एएसपी.नेट कोर के स्रोतों की खोज कर रहा था यह देखने के लिए कि एएसपी.नेट टीम किस तरह की चाल ढांचे को तेज करने के लिए उपयोग करती है। मैंने कुछ ऐसा देखा जो मुझे चिंतित करता था। ServiceProvider के स्रोत कोड, निपटान कार्यान्वयन में में, वे एक शब्दकोश की गणना, और वे एक प्रदर्शन चाल इंगित करने के लिए एक टिप्पणी डाल:एन्युमेरेट डिक्शनरी। वैल्यू बनाम डिक्शनरी खुद

private readonly Dictionary<IService, object> _resolvedServices = new Dictionary<IService, object>(); 

// Code removed for brevity 

public void Dispose()  
{   
    // Code removed for brevity 

    // PERF: We've enumerating the dictionary so that we don't allocate to enumerate. 
    // .Values allocates a KeyCollection on the heap, enumerating the dictionary allocates 
    // a struct enumerator 
    foreach (var entry in _resolvedServices) 
    { 
     (entry.Value as IDisposable)?.Dispose(); 
    } 

    _resolvedServices.Clear();   
} 

अंतर अगर शब्दकोश ऐसा प्रगणित है क्या है?

foreach (var entry in _resolvedServices.Values) 
{ 
    (entry as IDisposable)?.Dispose(); 
} 

यह एक प्रदर्शन प्रभाव पड़ता है? या ऐसा इसलिए है क्योंकि ValueCollection आवंटित करने से अधिक स्मृति मिल जाएगी?

उत्तर

8

आप सही हैं, यह स्मृति खपत के बारे में है। अंतर वास्तव में टिप्पणी में बहुत अच्छी तरह वर्णित है: ValueDictionary<TKey, TValue>will allocate a ValueCollection की संपत्ति, जो ढेर पर एक वर्ग (संदर्भ प्रकार) है, तक पहुंच।

foreach 'शब्दकोश में ही GetEnumerator() के लिए एक कॉल जो एक Enumerator रिटर्न में जो परिणाम के माध्यम से ing। यह struct है और ढेर के बजाय ढेर पर आवंटित किया जाएगा।

+1

ऐसा लगता है कि मैंने हेपिंग और स्टैकिंग की अवधारणा को याद किया है, जिसे यहां वर्णित किया गया है http://www.c-sharpcorner.com/UploadFile/rmcochran/csharp_memory01122006130034PM/csharp_memory.aspx वैसे भी धन्यवाद। –

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