Android 性能 - “避免内部 Getters/Setters”

2022-09-01 20:25:41

只需在开发网站上阅读以下内容:

避免内部获取器/Setters

在像C++这样的母语中,通常的做法是使用getters(例如i = getCount())而不是直接访问字段(i = mCount)。对于C++来说,这是一个很好的习惯,因为编译器通常可以内联访问,如果需要限制或调试字段访问,可以随时添加代码。

在Android上,这是一个坏主意。虚拟方法调用成本高昂,远高于实例字段查找。遵循常见的面向对象编程实践并在公共接口中使用 getter 和 setter 是合理的,但在类中,您应该始终直接访问字段。

如果没有JIT,直接现场访问比调用一个微不足道的getter快3倍。使用JIT(直接现场访问与访问本地一样便宜),直接现场访问比调用微不足道的getter快7倍。这在 Froyo 中是正确的,但将来当 JIT 内联 getter 方法时会有所改善。

2019/05年更新:在当前版本中,上述材料已从文档中删除!

因此,它是否表示您将在类中使用字段访问:

 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

       }

 }

答案 1

使用内部 getter 和 setter 的性能影响也适用于外部 getter 和 setter。

然而,在外部情况下,获取者和二传手在其他领域具有显着的好处;例如,保留封装,减少有害耦合,使代码更易于维护,等等。因此,通常认为使用 getter 和 setter 是最佳做法,尽管这可能会对性能造成影响。

性能下降是旧版Android JIT编译器局限性的结果。这种情况在姜饼中得到了显着改善(参见 - https://stackoverflow.com/a/4930538/139985 ...并注意谁写了那个答案!并不断改进。事实上,在当前(2019年)版本的“性能提示”中,有关内部获取器和二传手的整个建议部分已被删除。

一般来说,为劣质平台“调整”代码是一个坏主意,特别是如果有一个更好的平台即将到来的合理机会。


答案 2

虽然速度更快,但随着技术的进步(更好的cpu,JIT等),两个选项之间的差异会变小。b.innerObject

唯一重要的一点是在一直执行的密集循环中完成时。例如,在游戏的方法中,当您循环遍历数百个对象时。onDraw


推荐