我读的是Google's tips on Android optimisation,他们首先提到的一点是,你应该避免使用短期变量,因为这意味着更多的垃圾收集。
所以,有没有一点你最好定义一个变量并使用它,而不是每次你想使用这个对象时都调用一个访问器?说,这个:

for(int i = 0; i < 1000; i++) {
    foo.getBar() // then do something with it
}

与此相反:
Bar bar = foo.getBar();
for(int i = 0; i < 1000; i++) {
    bar // then do something with it
}

有什么区别,从表现上看?

最佳答案

假设没有编译器优化
当你使用

for(int i = 0; i < 1000; i++) {
    foo.getBar() // then do something with it
}

您的代码将转到foo引用的实例,执行其getBar()方法,然后返回它应该返回的任何实例/值。这将为循环的1000次执行中的每一次执行完成。每次执行完成后,必须对getBar()返回的值进行垃圾回收。
但是,当您使用:
Bar bar = foo.getBar();
for(int i = 0; i < 1000; i++) {
    bar // then do something with it
}

只有一次在循环外获得foo.getBar()的值,并在本地存储它的副本。然后在循环中使用此本地副本1000次。
第二个选项更有效,因为您的foo实例的getBar()方法只调用一次,而不是上千次。这意味着您不执行getBar()方法中的代码1000次,这显然比执行一次要糟糕。
这些都是真正的微观优化。除非您在getBar()中进行一些真正的重物提升,否则这不会产生明显的效果。在很多情况下,编译器优化会将这两个字节码转换成完全相同的字节码,所以您无论如何都不会担心它。

09-06 01:57