Android 代码性能优化建议(2)

然而,在Android上,这是一个糟糕的写法。虚函数的调用比起直接访问变量要耗费更多。在面向对象编程中,将getter和setting暴露给公用接口是合理的,但在类内部应该仅仅使用域直接访问。

在没有JIT(Just In Time Compiler)时,直接访问变量的速度是调用getter的3倍。有JIT时,直接访问变量的速度是通过getter访问的7倍。

请注意,如果你使用ProGuard, 你可以获得同样的效果,因为ProGuard可以为你inline accessors.

使用增强的For循环

增强的For循环(也被称为 for-each 循环)可以被用在实现了 Iterable 接口的 collections 以及数组上。使用collection的时候,Iterator (迭代器,译者注) 会被分配,用于for-each调用hasNext()和next()方法。使用ArrayList时,手写的计数式for循环会快3倍(不管有没有JIT),但是对于其他collection,增强的for-each循环写法会和迭代器写法的效率一样。

请比较下面三种循环的方法:

staticclassFoo{

int mSplat;

}

Foo[] mArray =...

publicvoid zero(){

int sum =0;

for(int i =0; i < mArray.length;++i){

sum += mArray[i].mSplat;

}

}

publicvoid one(){

int sum =0;

Foo[] localArray = mArray;

int len = localArray.length;

for(int i =0; i < len;++i){

sum += localArray[i].mSplat;

}

}

publicvoid two(){

int sum =0;

for(Foo a : mArray){

sum += a.mSplat;

}

}

zero()是最慢的,因为JIT没有办法对它进行优化。

one()稍微快些。

two() 在没有做JIT时是最快的,可是如果经过JIT之后,与方法one()是差不多一样快的。它使用了增强的循环方法for-each。

所以请尽量使用for-each的方法,但是对于ArrayList,请使用方法one()。

你还可以参考 Josh Bloch 的 《Effective Java》这本书的第46条

使用包级访问而不是内部类的私有访问

参考下面一段代码

publicclassFoo{

privateclassInner{

void stuff(){

Foo.this.doStuff(Foo.this.mValue);

}

}

privateint mValue;

publicvoid run(){

Innerin=newInner();

mValue =27;

in.stuff();

}

privatevoid doStuff(int value){

System.out.println("Value is "+ value);

}

}

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/847f1947bdbcd748e829ece4fa60a4a6.html