C# 存储方法返回还是重复调用?

C# 存储方法返回还是重复调用?,c#,optimization,C#,Optimization,如果我要多次访问一个函数的值,例如myString.SubString(5,5),我会看到两个选项 我就是这么做的,打三次电话 我存储为string tempString=myString.SubString(5,5),并使用tempString三次 假设这是一个函数的一部分,我在一个帧内调用了一百万次,在案例1中我比案例2使用了更多的cpu是吗 然而,在案例2中,我创建了一个局部变量数百万次,并且在下一帧垃圾被收集之前会占用更多内存 我使用的是一个非常小的例子,但在一般实践中,如果一个比另一个

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

  • 我就是这么做的,打三次电话
  • 我存储为string tempString=myString.SubString(5,5),并使用tempString三次
  • 假设这是一个函数的一部分,我在一个帧内调用了一百万次,在案例1中我比案例2使用了更多的cpu是吗

    然而,在案例2中,我创建了一个局部变量数百万次,并且在下一帧垃圾被收集之前会占用更多内存

    我使用的是一个非常小的例子,但在一般实践中,如果一个比另一个好,我肯定可以预见做出正确选择可能会影响性能的时间


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

    您似乎对对象分配和局部变量的差异感到困惑

    首先,让我们讨论一下基本问题。如果调用
    string.SubString
    ,它返回的值小于原始字符串,那么它将创建一个新的字符串对象。每一次。我希望它返回原始字符串,如果你给它索引,这样就可以返回整个字符串,但这与这里无关

    因此,这将创建一个新对象,每次:

    现在,如果您将这个新对象存储到一个局部变量中,您唯一要做的就是开始控制该对象的生存期。它可能会也可能不会影响垃圾收集器何时可以收集这个新的字符串对象,但这并不会创建额外的对象,您只是将已经创建的对象引用存储到一个局部变量中

    是的,局部变量占用空间,但是如果在表达式中使用
    子字符串
    调用的结果,那么无论如何都会创建类似于局部变量的内容,只是编译器在幕后为您执行此操作


    如果你在循环中做一些事情,每个循环迭代都需要这个子串3次,那么是的,一定要将其存储在一个变量中,以避免2个额外的对象分配以及与对
    子字符串的2个额外调用相关的成本

    您似乎对对象分配和局部变量的差异感到困惑

    首先,让我们讨论一下基本问题。如果调用
    string.SubString
    ,它返回的值小于原始字符串,那么它将创建一个新的字符串对象。每一次。我希望它返回原始字符串,如果你给它索引,这样就可以返回整个字符串,但这与这里无关

    因此,这将创建一个新对象,每次:

    现在,如果您将这个新对象存储到一个局部变量中,您唯一要做的就是开始控制该对象的生存期。它可能会也可能不会影响垃圾收集器何时可以收集这个新的字符串对象,但这并不会创建额外的对象,您只是将已经创建的对象引用存储到一个局部变量中

    是的,局部变量占用空间,但是如果在表达式中使用
    子字符串
    调用的结果,那么无论如何都会创建类似于局部变量的内容,只是编译器在幕后为您执行此操作


    因此,如果您在循环中执行某些操作,并且每次循环迭代都需要此子字符串3次,那么是的,一定要将其存储在变量中,以避免2个额外的对象分配以及与对
    子字符串的2个额外调用相关的成本当我使用一段数据超过1次时,我通常会存储它。因为你不想让你的程序多次运行同一段代码来返回你应该已经拥有的数据。我总是选择案例2。。如果你不止一次需要完全相同的结果。。为什么要重做呢。。是的,你可以调用它一百万次,是的,一百万次1个变量被生成、使用和遗忘,这比三百万次调用字符串要好。很难想象这种情况。如果你有一个代码要放,那就更好了。但通常情况下,决定是否使用临时变量的条件是,如果仍然需要原始变量,则保留它。如果不是,就使用原始变量贪婪,如果返回值不变,我总是将该值指定给属性当我使用一段数据超过1次时,我通常会存储它。因为你不想让你的程序多次运行同一段代码来返回你应该已经拥有的数据。我总是选择案例2。。如果你不止一次需要完全相同的结果。。为什么要重做呢。。是的,你可以调用它一百万次,是的,一百万次1个变量被生成、使用和遗忘,这比三百万次调用字符串要好。很难想象这种情况。如果你有一个代码要放,那就更好了。但通常情况下,决定是否使用临时变量的条件是,如果仍然需要原始变量,则保留它。如果不是,就使用原始变量贪婪,如果返回值没有改变,我总是将该值赋给属性,因为它是局部的,这是有意义的,它要么存在,要么存在。我通常只是因为感觉好一点才储存东西,但我对“正确”的解释并不乐观。现在我是!谢谢。\n因为它是本地的,这是有道理的,它要么存在,要么存在。我通常只是因为感觉好一点才储存东西,但我对“正确”的解释并不乐观。现在我是!多谢各位\
    
    myString.SubString(5,5)