Java:哪个更快?本地变量还是访问封装?

5

我最近阅读了一个StackOverflow的问题,它表明,在访问变量时,使用栈比使用堆更快:

void f() {
    int x = 123; // <- located in stack
}

int x; // <- located in heap
void f() {
    x = 123  
}

然而,我无法确定在我的例子中哪个更快(因为我假设它们都使用堆栈)。我正在处理碰撞检测等内容,其中函数中使用了许多X-Y、宽度、高度变量(每个变量可能会被使用10-20次)。

每次使用一个对象的get()方法是否更快,还是在函数开始时将其设置为局部变量?

在代码中,以下哪种方式更快(或更有效):

void f() {
    doSomething(foo.getValue() + bar.getValue()); 
    doSomethingElse(foo.getValue(), bar.getValue());
    doAnotherThing(foo.getValue(), bar.getValue());
    // ... <- lot's of accessing (something.getValue());
}

或者

void g() {
    int firstInt = foo.getValue();
    int secondInt = bar.getValue();

    doSomething(firstInt + secondInt);
    doSomethingElse(firstInt, secondInt);
    doAnotherThing(firstInt, secondInt);
    // ... <- lot's of accessing firstInt and secondInt
}

foobarMyObject 的时候
public class MyObject {
    int x = 1;
    public int getValue() {
        return x;
    }
}

如果它们的效率相同,我需要执行多少次 .getValue() 才会变得不太高效?
先行致谢!

1
请不要试图像这样优化您的代码。首先让它能够工作...总的来说,这些微小的优化是毫无意义的。您需要在真实的代码中进行基准测试,以确定它们是否对您的用例有影响。 - Elliott Frisch
4
为什么这很重要?请谷歌搜索“过早优化”。 - Jim Garrison
1
如果你想知道效率的转折点在哪里,你需要自己进行适当的微基准测试。答案因硬件和软件而异。 - Chris Hayes
我相信我不是唯一一个不知道基准测试存在的人。我的代码确实可以工作,所以我只是想问一下它是否有所不同,如果有人知道,那么这种差异是什么。 - snickers10m
1
我不会相信你链接的帖子。正确测量后,你肯定会发现没有任何区别... - assylias
显示剩余3条评论
2个回答

10

-1

如果您使用局部变量,可以告诉编译器该值不会被更改 final int x = ...;,将其变为某种局部常量。

重新分配值(回收对象等)可以帮助减少垃圾回收(GC)。

编写一些极限压力测试,如果可能的话还要有可视化效果,让其运行一段时间并测量实际性能和感知性能。一个更好、更快的时间并不总是更好,有时它可能会慢一些,但在执行过程中更加流畅。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接