【发布时间】:2014-04-02 22:37:59
【问题描述】:
我尝试将一大块内存分配为字节数组 (400MB)
public static void Main(string[] args)
{
const int MegaByte = 1048576;
byte[] bytes = new byte[400 * MegaByte];
for (int i = 0; i < bytes.Length; i++)
{
bytes[i] = 3;
}
Console.WriteLine("Total array length : {0}", bytes.Length);
Console.WriteLine("First byte = '{0}' Last byte = '{1}'", bytes[0], bytes[bytes.Length - 1]);
Console.Read();
}
输出:
Total array length : 419430400
First byte = '3' Last byte = '3'
正如预期的那样,当我刚刚分配了 400MB 内存时,我在 Windows 任务管理器中看到正在使用的内存大幅跃升。但是,如果我将 forloop 用法替换为仅使用第一个和最后一个字节:
public static void Main(string[] args)
{
const int MegaByte = 1048576;
byte[] bytes = new byte[400 * MegaByte];
bytes[0] = 0;
bytes[bytes.Length - 1] = 2;
Console.WriteLine("Total array length : {0}", bytes.Length);
Console.WriteLine("First byte = '{0}' Last byte = '{1}'", bytes[0], bytes[bytes.Length - 1]);
Console.Read();
}
输出:
Total array length : 419430400
First byte = '0' Last byte = '2'
即使分配的数组的长度据说相同,也没有观察到已用内存的大幅跳跃。我有一个假设,如果我们在 Debug 中构建,就不会有这样的优化。是否有一些优化是在“调试”构建期间完成的,或者在编译 IL 时这些事情会在较低级别进行优化吗?
【问题讨论】:
-
GC.GetTotalMemory()在您的数组前后返回什么?可能是任务管理器未报告当前未使用的内容。 -
在这两种情况下,
GC.GetTotalMemory()都显示了419432348从分配前到分配后的跳跃,所以这可能是正在发生的事情。
标签: c# memory optimization build