在.Net中创建局部变量

时间:2009-03-15 18:28:27

标签: c# premature-optimization

我只是想知道创建局部变量以接受函数的返回值将会影响.Net应用程序中的内存使用或性能,尤其是在ASP.Net中。

 MyObject myObject = Foo();
 MyOtherObject myOtherObject = Boo();

 SomeFuntion(myObject, myOtherObject);

OR

我应该使用

 MyFunction(Foo(), Boo());

当然以前的用法具有更好的可读性。但是内存使用和性能呢?

提前致谢 123Developer

4 个答案:

答案 0 :(得分:15)

不要过早优化;在发布版本中,编译器很可能无论如何都会优化它们!无论哪种方式,你只是在谈论少量的堆栈空间(大概)一些引用。两种方法都没问题;选择哪个更具可读性。

答案 1 :(得分:5)

CIL(编译C#的中间语言)是一种基于堆栈的语言,因此中间函数的返回值需要在作为参数传递到最后一个之前在堆栈上结束。

就本地人而言,没有办法预测C#编译器会做什么 [1] ;它可能决定在你做的时候使用locals,或者它可能会使用堆栈行为并完全跳过它们。同样,它可能会合成本地人,即使你不使用它们,也可能不合成。

无论哪种方式,性能差异都不值得担心。


[1] 是的,当然,您可以编译并查看它生成的IL以确定它将执行的操作,但这仅对您当前版本的编译器有效使用和是一个你不应该依赖的实现细节。

答案 2 :(得分:2)

我相信内存性能基本相同。除非性能测试显示出显着差异,否则请选择具有增强可读性的选项。

答案 3 :(得分:0)

不要害怕使用局部变量。内存使用和性能的差异非常小,或者在某些情况下根本没有。

在您的特定情况下,局部变量可能使用堆栈空间的8个字节(64位应用程序上的16个字节)。但是,如果临时存储需要,编译器可以自己创建局部变量,因此两个版本都可能具有相同的局部变量集。

此外,编译器可以使用处理器寄存器而不是堆栈空间用于某些局部变量,因此甚至不能确定创建局部变量实际上是否使用任何堆栈空间。

无论如何,分配堆栈空间非常便宜。调用该方法时,将为该方法中的本地数据创建堆栈帧。如果必须分配更多的内存,那只会改变堆栈指针的移动量,它根本不会产生任何额外的代码。

因此,只需编写代码,使其具有可维护性和健壮性,并相信编译器可以优化变量的使用。