2011-05-11 12 views
5
long b = GC.GetTotalMemory(true); 
SortedDictionary<int, int> sd = new SortedDictionary<int, int>(); 
for (int i = 0; i < 10000; i++) 
{ 
    sd.Add(i, i+1); 
} 
long a = GC.GetTotalMemory(true); 
Console.WriteLine((a - b));    
int reference = sd[10];  

उत्पादन (32 बिट):सॉर्टेड डिक्शनरी को इतना ऊपरी क्यों चाहिए?

280108 

उत्पादन (64 बिट):

480248 

अकेले (एक सरणी में) ints भंडारण के बारे में 80000.

+0

.NET रनटाइम में आपका स्वागत है। –

+0

क्योंकि यह एक पेड़ है। सॉर्टेडलिस्ट और एक सादा सूची भी होती है जो सॉर्ट किया जाता है (आइटम को अपनी उचित जगह में सम्मिलित करना सुनिश्चित करें) – harold

उत्तर

5

आंतरिक SortedDictionary<TKey, TValue>TreeSet<KeyValuePair<TKey, TValue>> का उपयोग करता है। पेड़ Node<T> का उपयोग करता है और स्पष्ट रूप से यह नोड्स के बीच संदर्भों का उपयोग करता है, इसलिए प्रत्येक कुंजी और मूल्य के अतिरिक्त आपके पास बाएं और दाएं नोड्स के साथ-साथ कुछ अतिरिक्त गुण भी होंगे। Node<T> एक वर्ग है इसलिए प्रत्येक उदाहरण में संदर्भ प्रकार का पारंपरिक ओवरहेड होता है। इसके अलावा, प्रत्येक नोड एक बूलियन भी संग्रहीत करता है जिसे IsRed कहा जाता है।

WinDbg/SOS के अनुसार 48 बाइट्स में 64 बिट्स पर एक एकल नोड का आकार, इसलिए उनमें से 10000 कम से कम 480000 बाइट्स ले लेंगे।

0:000> !do 0000000002a51d90 
Name:   System.Collections.Generic.SortedSet`1+Node[[System.Collections.Generic.KeyValuePair`2[[System.Int32, mscorlib],[System.Int32, mscorlib]], mscorlib]] 
MethodTable: 000007ff000282c8 
EEClass:  000007ff00133b18 
Size:  48(0x30) bytes  <== Size of a single node 
File:   C:\windows\Microsoft.Net\assembly\GAC_MSIL\System\v4.0_4.0.0.0__b77a5c561934e089\System.dll 
Fields: 
       MT Field Offset     Type VT  Attr   Value  Name 
000007feeddfd6e8 4000624  18  System.Boolean 1 instance    0  IsRed 
000007feee7fd3b8 4000625  20 ...Int32, mscorlib]] 1 instance 0000000002a51db0 Item 
000007ff000282c8 4000626  8 ...lib]], mscorlib]] 0 instance 0000000002a39d90 Left 
000007ff000282c8 4000627  10 ...lib]], mscorlib]] 0 instance 0000000002a69d90 Right 
+0

क्या इसकी वास्तव में इसकी कार्यक्षमता के लिए इस ओवरहेड की आवश्यकता है? – willem

+1

@ विलेम: मुझे लगता है कि असली सवाल है; क्या आपको SortedDictionary की सभी कार्यक्षमता की आवश्यकता है। यदि ऐसे विकल्प नहीं हैं जो कम जगह लेते हैं। SortedDictionary http://msdn.microsoft.com/en-us/library/f7fta44c.aspx की विशेषताओं की सूची के लिए प्रलेखन के टिप्पणियां अनुभाग देखें –

2

की आवश्यकता होगी यह पूरी तरह से SortedDictionary वर्ग के कार्यान्वयन और .NET रनटाइम या सीएलआर के साथ कुछ भी करने पर निर्भर करता है। आप अपने स्वयं के क्रमबद्ध शब्दकोश को कार्यान्वित कर सकते हैं और नियंत्रित कर सकते हैं कि कितना और कितना आवंटित किया जाता है। संभवतः सॉर्ट किए गए डिक्शनरी कार्यान्वयन स्मृति आवंटन के मामले में अधिक कुशल नहीं है।