Console.WriteLine()的高内存使用率

时间:2011-06-21 18:44:29

标签: c# memory-management

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

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)。

为什么会有这么大的差异?为什么第一个代码需要所有这些对象?如何减少内存分配?

2 个答案:

答案 0 :(得分:9)

内存增加很可能是因为解析格式字符串所涉及的复杂性。

在第一种情况下,它必须解析格式字符串,获取表示整数的本地化字符串并将其放在格式字符串的正确位置。

在第二种情况下,您只输出一个值,更重要的是输出一个普通字符串。相比之下,这是非常微不足道的。

如果您对隐藏的内容感兴趣,可以使用.NET Reflector并查看WriteLine重载。

答案 1 :(得分:3)

这是特定于运行时的问题。
我的猜测是,由于intString的转换,第一个代码会占用大量内存,而这必须是为了正确格式化Console.WriteLine的字符串。