2011-06-21 79 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 MB。大約20 MB分配給String,9 MB到Char[],5 MB到StringBuilder和3 MB到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 MB。 4 MB分配給Char[]

我唯一得到的是數組a應該需要1 MB(250,000 * 4)。

爲什麼會有這麼大的差異?爲什麼第一個代碼需要所有這些對象,以及如何減少內存分配?

回答

8

內存增加的可能性最大的原因是解析格式字符串時涉及的複雜性。

在第一種情況下,它必須解析格式字符串,獲取一個表示整數的本地化字符串並將其放在格式字符串的正確位置。

在你的第二種情況下,你只輸出一個值,甚至更簡單的字符串。相比之下,這是非常微不足道的。

如果您對封面內容感興趣,您可以使用.NET Reflector並查看WriteLine重載。

+3

可能常量字符串「0」被禁用,所以只存在它的一個實例。 –

3

這是一種特定於運行時的問題。
我的猜測是,第一個代碼會使用如此多的內存,因爲要將int轉換爲String,爲了正確設置Console.WriteLine的字符串格式,必須進行此操作。