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

本文关键字:使用率 内存 WriteLine Console | 更新日期: 2023-09-27 17:59:59

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。4MB被分配给CCD_ 5。

我得到的唯一信息是,数组a应该需要1MB(250000*4(。

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

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

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

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

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

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

这是一个特定于运行时的问题
我的猜测是,由于intString的转换,第一个代码使用了如此多的内存,为了正确地格式化Console.WriteLine的字符串,必须进行转换。