2011-06-21 16 views
7
public static void Main() 
{ 
    int size = 250000; 
    var a = new int[size]; 
    for (int i = 0; i < size; i++) 
     Console.WriteLine("{0}", a[i]); 
} 

जब मैंने CLRProfiler के साथ उपरोक्त कोड का परीक्षण किया, तो उसने मुझे बताया कि कोड लगभग 40 एमबी आवंटित करता है। लगभग 20 एमबी String, 9 एमबी से Char[], 5 एमबी से StringBuilder और 3 एमबी से Int32 को आवंटित किया गया है।Console.WriteLine()

public static void Main() 
{ 
    int size = 250000; 
    var a = new int[size]; 
    for (int i = 0; i < size; i++) 
     Console.WriteLine("0"); 
} 

यह लगभग 5 एमबी आवंटित करता है। 4 एमबी Char[] को आवंटित किया गया है।

मुझे केवल एक चीज है कि सरणी a को 1 एमबी (250,000 * 4) की आवश्यकता होनी चाहिए।

इतना बड़ा अंतर क्यों है? उन सभी ऑब्जेक्ट्स को पहले कोड के लिए क्यों आवश्यक है और मैं स्मृति आवंटन को कैसे कम करूं?

उत्तर

8

अधिकतर स्मृति वृद्धि प्रारूप स्ट्रिंग को पार्स करने में शामिल जटिलता के कारण होती है।

अपने पहले मामले में, इसे प्रारूप स्ट्रिंग को पार्स करना होगा, एक स्थानीय स्ट्रिंग को पूर्णांक का प्रतिनिधित्व करना होगा और इसे प्रारूप स्ट्रिंग के सही स्थान पर रखना होगा।

अपने दूसरे मामले में आप केवल एक ही मूल्य आउटपुट कर रहे हैं, और इससे भी अधिक, एक सादा स्ट्रिंग। यह तुलना में बहुत तुच्छ है।

यदि आप कवर के तहत क्या चल रहे हैं में रुचि रखते हैं तो आप .NET Reflector का उपयोग कर सकते हैं और WriteLine ओवरलोड पर एक नज़र डालें।

+3

और शायद निरंतर स्ट्रिंग "0" को प्रशिक्षित किया गया है, इसलिए इसमें केवल एक उदाहरण मौजूद है। –

3

यह रनटाइम-विशिष्ट प्रश्न है।
मेरा अनुमान है कि पहला कोड int से String के रूपांतरण के कारण बहुत मेमोरी का उपयोग करता है, जिसे Console.WriteLine के लिए स्ट्रिंग को सही तरीके से प्रारूपित करने के लिए किया जाना है।

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