.NET内存消耗问题
这些方法中的任何一个比其他方法使用更多的内存还是将更大的负载放在GC上?.NET内存消耗问题
选项#1
LargeObject GetObject()
{
return new LargeObject();
}
选项#两种方法2
LargeObject GetObject()
{
LargeObject result = new LargeObject();
return result;
}
编译器将生成等效于代码版本2的IL,需要虚拟堆栈位置来存储对象引用。 JIT优化器将生成等价于代码版本1的机器代码,该引用存储在CPU寄存器中。
换句话说,没关系。您在运行时获得完全相同的机器码。
堆内存使用是相等的。在第二种情况下创建局部变量的开销很小,但它不应该打扰你。变量将被存储在堆栈中,不会对GC产生额外的压力。此外,这个附加变量可能会被编译器或JIT优化(所以它可能不会出现在实际由CLR执行的代码中)。
你可以看看生成的IL(使用反射镜),看看它是否不同的。根据编译优化设置,#2可能会在堆栈上存储一个额外的值(对于result
值),但这只会是额外的4或8个字节(如果它是一个类,它应该是!),并且会根本不影响GC。
IL虽然不是编译好的代码。这只是一个中间步骤。 – 2010-10-28 17:00:55
是的,但如果IL是相同的,那么代码将完全相同。 – thecoop 2010-10-29 08:37:14
在发布模式下生成的代码不会有任何区别。 JIT编译器几乎肯定会删除不必要的临时变量。 – 2010-10-28 15:44:24