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

roh*_*t89 8 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]);
}
Run Code Online (Sandbox Code Playgroud)

当我用CLRProfiler测试上面的代码时,它告诉我代码分配大约40 MB.大约20 MB分配给String,9 MB到Char[]5 MB到StringBuilder3 MB到Int32.

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

这个分配大约5 MB.分配4 MB Char[].

我唯一得到的是阵列a应该需要1 MB(250,000*4).

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

Sku*_*del 9

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

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

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

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

  • 并且可能是常量字符串"0"被实现,因此只存在一个实例. (3认同)