'避免内部吸收者/安装者'
只需在开发者网站上阅读以下内容:
避免内部吸收者/安装者
在像C ++这样的本地语言中,通常使用getter(例如i = getCount())而不是直接访问字段(i = mCount)。 对于C ++来说,这是一个很好的习惯,因为编译器通常可以内联访问,如果需要限制或调试字段访问,则可以随时添加代码。
在Android上,这是一个坏主意。 虚拟方法调用比实例字段查找更昂贵。 遵循常见的面向对象的编程实践是合理的,并且在公共接口中有getter和setter,但在一个类中,您应该总是直接访问字段。
没有JIT,直接字段访问比调用一个简单的getter快3倍。 使用JIT(直接字段访问与访问本地一样便宜),直接字段访问比调用一个简单的getter快7倍。 Froyo确实如此,但在JIT内嵌getter方法时将来会有所改进。
那么它是说你会在课堂上使用字段访问:
public class MyObject {
public Object innerObject; // This would be private if I was using a getter
public void doSomeStuff(){
if(innerObject){ // Within class access like this
// ....
}
}
public Object getInnerObject(){ // This would be removed if I was using field access
return innerObject;
}
}
但是从另一个对象访问呢?:
public class SecondObject {
public void doSecondSomething(){
MyObject ob = new MyObject();
Object inner;
//This is my question basically (from an Android performance perspective)
inner = ob.getInnerObject();
// OR
inner = b.innerObject
}
}
使用内部getter和setter的性能命中也适用于外部getter和setter。
然而,在外部情况下,吸气剂和安装剂在其他领域具有显着的优势; 如保护封装,减少有害耦合,使代码更易于维护等等。 所以,尽管这可能会导致性能下降,但通常认为这是使用getter和setter的最佳做法。
性能下降是当前一代Android JIT编译器局限性的结果。 这种情况肯定会改善与姜饼的改善。 (参考 - https://stackoverflow.com/a/4930538/139985 ...并注意谁写的答案!)
一般来说,为一个劣质平台“调整”你的代码是一个糟糕的主意,特别是如果有合理的机会出现更好的代码。
尽管b.innerObject
速度更快,但随着技术的进步(更好的cpus,JIT等),两种选择之间的差异会变小。
唯一需要注意的地方是在密集的循环中完成,而这些循环始终执行。 例如,在游戏的onDraw
方法中,当您循环访问数百个对象时。
请记住,只有在每秒访问成员数千次的情况下,这些性能考虑才有意义。
直接访问可能是一个好主意的一个很好的例子是游戏的场景图(libgdx)
public abstract class Actor {
public Group parent;
public final String name;
public boolean touchable = true;
public float x;
public float y;
public float width;
public float height;
public float originX;
public float originY;
public float scaleX = 1;
public float scaleY = 1;
public float rotation;
public final Color color = new Color(1, 1, 1, 1);
链接地址: http://www.djcxy.com/p/23671.html