4

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

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

 SomeFuntion(myObject, myOtherObject);

或者

我应该使用

 MyFunction(Foo(), Boo());

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

在此先感谢 123Developer

4

4 回答 4

15

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

于 2009-03-15T18:30:47.947 回答
5

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

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

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


[1]是的,当然,您可以编译并查看它生成的 IL 以确定它将做什么,但这仅对您正在使用的编译器的当前版本有效,并且是您不应该执行的实现细节依靠。

于 2009-03-15T18:36:26.700 回答
2

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

于 2009-03-15T18:31:26.727 回答
0

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

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

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

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

因此,只需编写可维护且健壮的代码,并相信编译器会优化变量的使用。

于 2009-03-15T21:04:37.450 回答