我有一个名为“模拟”的类和一个解决模拟的方法。
class sim
{
void Step()
{
}
other methods (20+)...
}
Sim类只在程序中实例化一次。
在程序期间以数百万的顺序调用步骤方法。
Step方法使用了很多局部变量(100+)。在其他方法中没有使用这些本地人。
最好是将这些局部变量作为类的成员,还是将它们保存为Step()中的本地变量以获得更好的性能?
答案 0 :(得分:4)
depends。什么类型的变量:原始类型或对象?如果是后者,你的IL代码仍然会追逐他们的指针。如果是前者,则取决于您访问它们的顺序以及您要定位的CPU。优化变量的布局应该远远落在性能调优活动的列表中,特别是在C#中,当您依赖于IL转换成的汇编时。
与往常一样进行优化:首先衡量性能以识别瓶颈。然后考虑你可以做些什么来删除它们。在您知道需要执行类似操作之前,请尽可能清楚地编写代码:不要通过将局部变量提升到类级别来不必要地暴露局部变量。并且考虑拆分Step()
方法:大方法难以理解,因此更难以优化。
答案 1 :(得分:2)
作为一般规则,您应该最小化变量的范围,并且只有在证明绝对必要时才增加范围。将本地变换为成员变量是一个糟糕的设计选择,因此需要非常强有力的理由。
另请注意,如果局部变量具有非平凡的构造函数,则它们只有成本。具有noop构造函数或根本没有构造函数的局部变量没有设置成本,因此扩展其范围毫无意义。
答案 2 :(得分:0)
如果某些变量包含可在多个方法调用之间重用的对象,则可以省去处理旧实例和使用每个方法调用创建新实例的开销。例如,在方法调用之间不会改变的依赖注入容器中的查找可以在字段中“缓存”。
但除此之外,你可能不会获得太多的性能提升。您可以试一试并使用分析器来衡量代码性能。分析器还可以帮助您识别代码中的其他瓶颈。