Console.WriteLine()的高内存使用率
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[]
。
我唯一得到的是arraysa
应该需要1 MB(250,000 * 4)。
为什么会有这么大的差异? 为什么第一个代码需要所有这些对象?如何减少内存分配?
很可能内存增加是因为解析格式字符串所涉及的复杂性。
在第一种情况下,它必须解析格式字符串,获取表示整数的本地化字符串并将其放在格式字符串的正确位置。
在第二种情况下,您只输出一个值,更重要的是,输出一个纯字符串。 相比之下,这是非常微不足道的。
如果您对幕后的内容感兴趣,可以使用.NET Reflector并查看WriteLine
重载。
这是一种特定于运行时的问题。
我的猜测是第一个代码使用了如此多的内存,因为将int
转换为String
,必须这样才能正确格式化Console.WriteLine
字符串。