我在读这个:http: //developer.android.com/training/articles/perf-tips.html
特别是关于内部 getter 和 setter:
虚拟方法调用很昂贵,比实例字段查找要贵得多。遵循常见的面向对象编程实践并在公共接口中使用 getter 和 setter 是合理的,但在类中,您应该始终直接访问字段。
如果没有 JIT,直接字段访问比调用普通 getter 快大约 3 倍。使用 JIT(直接字段访问与访问本地一样便宜),直接字段访问比调用普通 getter 快约 7 倍。
它提到了“虚拟方法调用”,它可能也指公共方法。我的班级中有一堆方法不应该被覆盖。例如:
public class Something {
private float m_Float = 0.0f;
public float getFloat () {
return m_Float;
}
}
我总是希望“getFloat()”返回“m_Float”,即使在派生类中也是如此。将方法标记为“最终”是否会提高 Android 设备的性能?即使不是,最终正确性与 const 正确性一样重要吗?就像,当同事忘记最终正确性时,Java 程序员会发脾气吗?
如果标记该方法final
可以提高性能,那么以下性能增益是否无效?
public class Base {
public int getRandomNumber () {
return 4; //chosen by fair dice roll.
//guaranteed to be random.
}
}
public class Derived extends Base {
public final int getRandomNumber () {
return 6; //chosen by second fair dice roll.
//guaranteed to be more random.
}
}
在这一点上,我对优化我的代码并不感兴趣,但我对最终正确性位感兴趣。我不熟悉 Java 所关注的标准约定。
[编辑]
好的,所以,在上面,这个链接作为一个可能的答案给出:Android Performance - 'Avoid Internal Getters/Setters'
标记为答案的回复链接到此:我可以从 Dalvik 和 Android 工具链中获得哪些优化?
似乎现在内联了简单的 getter 和 setter。
在 Gingerbread 中,我们为 getter/setter 添加了简单的内联。由于底层的 JIT 前端仍然是简单的基于跟踪的,如果被调用者在那里有分支,它将不会被内联。但是实现了内联缓存机制,以便可以毫无问题地内联虚拟 getter/setter。
在评论中,有人问:
(3) 我应该尽可能将我的方法声明为 final 吗?或者这仍然算作虚拟呼叫站点吗?
这是回复:
(3) 是的,请
所以,有了这里的评论等等,我想说一切都解决了。(除了何时final
应该与方法一起使用;但这可能很快就会得到回答。我有一个信念,但正在等待它得到验证或有理由的反驳,所以..)
[编辑]
此外,这是否意味着 Android 文档。关于性能提示是..过时的?