我读的是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()
中进行一些真正的重物提升,否则这不会产生明显的效果。在很多情况下,编译器优化会将这两个字节码转换成完全相同的字节码,所以您无论如何都不会担心它。