ITEEDU

缓冲属性调用Cache Field Lookups

访问对象属性要比访问本地变量慢得多。你不应该这样写你的代码:

for (int i = 0; i < this.mCount; i++)
      dumpItem(this.mItems[i]);

而是应该这样写:

  int count = this.mCount;
  Item[] items = this.mItems;
 
  for (int i = 0; i < count; i++)
      dumpItems(items[i]);

(我们直接使用“this”表明这些是它的成员变量)

一个相似的原则就是:决不在一个For语句中第二次调用一个类的方法。例如,下面的代码就会一次又一次地执行getCount()方法,这是一个极大地浪费相比你把它直接隐藏到一个Int变量中。

for (int i = 0; i < this.getCount(); i++)
    dumpItems(this.getItem(i));

这是一个比较好的办法,当你不止一次的调用某个实例时,直接本地化这个实例,把这个实例中的某些值赋给一个本地变量。例如:

    protected void drawHorizontalScrollBar(Canvas canvas, int width, int height) {
        if (isHorizontalScrollBarEnabled()) {
            int size = mScrollBar.getSize(false);
            if (size <= 0) {
                size = mScrollBarSize;
            }
            mScrollBar.setBounds(0, height - size, width, height);
            mScrollBar.setParams(
                    computeHorizontalScrollRange(),
                    computeHorizontalScrollOffset(),
                    computeHorizontalScrollExtent(), false);
            mScrollBar.draw(canvas);
        }
    }

这里有四次mScrollBar的属性调用,把mScrollBar缓冲到一个堆栈变量之中,四次成员属性的调用就会变成四次堆栈的访问,这样就会提高效率。

附带说一下,对于方法同样也可以像本地变量一样具有相同的特点。