局部变量还是类字段?

2022-09-03 18:02:18

我今天读了一篇关于C#和Java性能改进的文章

我仍然坚持这个:


19. 不要过度使用实例变量

通过使用局部变量可以提高性能。示例 1 中的代码的执行速度将比示例 2 中的代码快。

示例 1:

public void loop() {
    int j = 0;
    for ( int i = 0; i<250000;i++){
        j = j + 1;
    }
}

示例 2:

int i;
public void loop() {
    int j = 0;
    for (i = 0; i<250000;i++){
        j = j + 1;
    }
}

实际上,我不明白为什么实例化一些内存并在每次调用函数时释放它应该更快,而我可以对字段进行简单的访问。loop

这纯粹是好奇,我不是想把变量“i”放在类的作用域中:p这是真的吗,使用局部变量更快?或者也许只是在某些情况下?


答案 1
  1. 堆叠速度比堆得更快。

    void f()
    {
        int x = 123; // <- located in stack
    }
    
    int x; // <- located in heap
    void f()
    {
        x = 123  
    }
    
  2. 不要忘记局部数据的原则。本地数据应该更好地缓存在 CPU 缓存中。如果数据接近,它们将完全加载到CPU缓存中,CPU不必从内存中获取它们。


答案 2

性能取决于获取变量所需的步骤数。局部变量地址在编译时是已知的(它们是堆栈上的已知偏移量),要访问成员,您需要加载对象“this”以获取实际对象的地址,然后才能获得成员变量的地址。


推荐