存储方法返回或重复调用它?

时间:2016-05-20 07:24:08

标签: c# optimization

如果我要多次访问某个函数的函数,例如myString.SubString(5,5),我会看到两个选项。

  1. 我这样做,三次打电话(让我们说)。
  2. 我存储为字符串tempString = myString.SubString(5,5)并使用tempString三次。
  3. 假设这是函数的一部分,我最终在一帧中调用了一百万次,如果是1,我使用的cpu比情况2更多?是的?

    在第二种情况下,我创建一个局部变量数百万次,并且在下一帧收集垃圾之前会占用更多内存。

    我使用的是一个非常小的例子,但在一般情况下,如果一个比另一个更好,我当然可以预见到做出正确选择会影响性能的时间。

    是否一个案例选择使用更多内存或更多CPU,一种做法通常比另一种更好?

1 个答案:

答案 0 :(得分:6)

您似乎对对象分配和局部变量的区别感到困惑。

首先让我们处理基础知识。如果您调用string.SubString并返回小于原始字符串,则会创建一个新的字符串对象。每次。我希望它能返回原始字符串,如果你给它索引,这样就可以返回整个字符串,但这里不相关。

所以这将创建一个新对象,每次

myString.SubString(5,5)

现在,如果将此新对象存储到本地变量中,那么唯一就是开始控制该对象的生存期。它可能会或可能不会对垃圾收集器何时收集此新字符串对象产生影响,但这绝不会创建额外的对象,您只 存储已创建的对象< em>引用到一个局部变量。

是的,局部变量占用空间,但是如果你在表达式中使用Substring调用的结果,那么无论如何都会创建类似于局部变量的东西,它只是编译器所做的在幕后为你服务。

因此,如果您在循环中执行某些操作,并且每次循环迭代将需要此子字符串3次,那么,肯定将其存储在变量中以避免2个额外的对象分配以及与Substring的2次额外调用相关的费用。