17

与直接返回分配给该变量的值相比,在函数中创建临时变量是否有任何性能损失或内存消耗差异?

例如,哪些函数(GetValue)在性能和节省内存方面更好,或者两者完全相同:

情况1:

  private string GetValue()
  {
     return this.GetResult();
  }

  private string GetResult()
  {
     // Code here that return a big string...
  }

案例二:

  private string GetValue()
  {
     string result = this.GetResult();

     return result;
  }

  private string GetResult()
  {
     // Code here that return a big string...
  }

谢谢你。

4

3 回答 3

17

在这些基本情况下,可读性总是胜过性能差异。我认为这充其量只是一个微优化,而这些在很大程度上被证明是浪费时间。你节省下来的东西将被不确定的 GC 运行吃掉。

大多数情况下,如果允许编译器对其进行优化,则生成的代码不会有任何差异。在这种情况下,生成的 IL 似乎有一些额外的操作码用于引用堆栈上的字符串,但是 JIT 然后对此做了什么,这是任何人的猜测。

我有时会在返回之前分解为临时变量以查看它们,但我从不担心性能影响。最重要的是,我从未见过需要这种改进来解决性能问题的案例。

于 2012-08-03T14:52:17.893 回答
6

如果局部变量实际上被可执行代码使用,并且没有被优化掉,那么差异仍然很小。

局部变量只使用存储引用所需的堆栈空间,并且为它分配空间根本不需要时间,因为无论如何总是分配堆栈帧。

几乎无法测量在局部变量之间进行额外复制的时间。只有在紧密循环中调用该方法数百万次时才会有所不同,并且与分配字符串所需的时间相比,它仍然只是执行时间的一小部分。

于 2012-08-03T15:06:46.573 回答
2

局部变量总是被优化的。

在 return 语句之前使用局部变量不会影响性能。

检查这里查看两个类的编译输出。

我更喜欢始终使用局部变量,因为它可以加快调试速度。据此开发人员将 75% 的时间用于调试。

于 2019-08-29T06:03:32.183 回答