如果我要多次访问一个值的函数,例如 myString.SubString(5,5),我会看到两个选项。
- 我就是这么做的,叫它(比方说)三遍。
- 我存储为字符串 tempString = myString.SubString(5,5) 并使用 tempString 三次。
假设这是我最终在一帧中调用一百万次的函数的一部分,在情况 1 中我使用的 cpu 比情况 2 多是吗?
然而,在情况 2 中,我创建了一个局部变量数百万次并使用了更多内存,直到可能在下一帧收集垃圾。
我使用的是一个非常小的例子,但在一般实践中,如果一个比另一个更好,我当然可以预见做出正确选择的时候可能会影响性能。
是根据具体情况选择使用更多内存还是更多 CPU,一种做法通常比另一种更好吗?
最佳答案
您似乎对对象分配和局部变量的区别感到困惑。
首先让我们来了解一下基础知识。如果您调用 string.SubString
并且它返回的小于原始字符串,那么它将创建一个新的字符串对象。每次。如果你给它索引等,我希望它返回原始字符串,以便返回整个字符串,但这与这里无关。
所以这将创建一个新对象,每次:
myString.SubString(5,5)
现在,如果您将这个新对象存储到一个局部变量中,您要做的唯一一件事就是开始控制该对象的生命周期。它可能会或可能不会实际影响垃圾收集器何时可以收集这个新的字符串对象,但这绝不会创建额外的对象,您只是存储已经创建的对象引用到局部变量。
是的,局部变量占用空间,但是如果你在表达式中使用 Substring
调用的结果,那么无论如何都会创建类似于局部变量的东西,这只是编译器做的在幕后为您服务。
所以如果你在循环中做某事,并且每个循环迭代将需要这个子字符串 3 次,那么是,一定要将它存储在一个变量中以避免 2 次额外的对象分配和与 Substring
的 2 次额外调用相关的成本。
关于c# - 存储方法返回还是重复调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37340453/