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

标签 c# optimization

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

  1. 我就是这么做的,叫它(比方说)三遍。
  2. 我存储为字符串 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/

相关文章:

c# - 具有双重身份验证的应用程序 : custom and Active Directory

c# - 为什么此 C# 构造函数会产生不一致的可访问性错误?

c++ - 模块化算法和 NTT(有限域 DFT)优化

c++ - 更快的循环范围 (C++11)

c# - 将 bool 条件解析为表达式树

c# - 将带有参数的 c# 回调方法传递给 c++ dll 会导致 System.ExecutionEngineException

c# - 更改禁用按钮上的文本颜色(自定义 ButtonRenderer)

algorithm - Boggle - 计算 N*N 网格上的所有可能路径。表现

jquery - 我可以简化/优化这个 Jquery 代码吗?

optimization - 木槌优化错误 : Exiting L-BFGS on termination #1