Android性能 - '避免内部吸气/安装者'

Blu*_*ell 23 java optimization performance android

只需在开发网站上阅读:

避免内部吸气/安装者

在像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;
    }
 }
Run Code Online (Sandbox Code Playgroud)

但是从另一个对象访问呢?

 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

       }

 }
Run Code Online (Sandbox Code Playgroud)

Ste*_*n C 31

使用内部getter和setter的性能也适用于外部getter和setter.

然而,在外部情况下,吸气剂和固定剂在其他领域具有显着的益处; 例如,保留封装,减少有害耦合,使代码更易于维护等等.因此,尽管可能会出现性能损失,但通常认为使用getter和setter 是最佳做法.

性能受到了当前一代旧版JIT编译器的限制.使用Gingerbread时,这种情况肯定会有所改善.(参考 - /sf/answers/345137691/ ...并注意谁写了这个答案!)

一般来说,为一个较差的平台"调整"你的代码是一个坏主意,特别是如果有一个合理的机会,一个更好的正在进行中.