2016-04-16 16 views
10

ASP.NET ekibinin çerçeveyi hızlandırmak için ne tür hileler kullandığını görmek için GitHub'da ASP.NET çekirdeğinin kaynaklarını araştırıyordum. Beni etkileyen bir şey gördüm. Imha uygulanmasında ServiceProvider kaynak kodunda,, onlar bir sözlük numaralandırmak ve onlar bir performans hile göstermek için bir yorum koyun:Enumerate Dictionary.Values ​​vs Sözlük kendisi

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();   
} 

Sözlük böyle sayılan eğer fark nedir?

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

bir performans etkisi vardır? Ya da bir ValueCollection tahsis etmek daha fazla hafıza tüketir mi?

cevap

8

Haklısınız, bu bellek tüketimiyle ilgilidir. Aradaki fark aslında oldukça iyi tanımlanmıştır: yığında bir sınıf (referans tipi) olan Dictionary<TKey, TValue>will allocate a ValueCollection'un Value özelliğine erişim. Sözlüğün kendisi, GetEnumerator() numaralı aramayı Enumerator döndüren bir çağrıyla sonuçlanır. Bu bir struct'dur ve yığın yerine yığında ayrılacaktır.

+1

Burada iyi tanımlanmış olan Yığınlama ve Yığınlama kavramını kaçırdım görünüyor http://www.c-sharpcorner.com/UploadFile/rmcochran/csharp_memory01122006130034PM/csharp_memory.aspx Bu arada. –