WEB开发网
开发学院手机开发Android 开发 Android应用程序运行的性能设计 阅读

Android应用程序运行的性能设计

 2013-01-14 16:07:08 来源:WEB开发网   
核心提示:◆ 在没有JIT的设备上,访问缓存后的字段比直接访问字段快大概20%,Android应用程序运行的性能设计(2),在有JIT的情况下,字段访问和局部访问耗费是一样的 ,他采用了JDK1.5中的改进for循环语法,结论:优先采用改进的for循环,所以这里不值得优化,除非你觉得他会让你的代码更易读(对于final,stat
◆ 在没有JIT的设备上,访问缓存后的字段比直接访问字段快大概20%。在有JIT的情况下,字段访问和局部访问耗费是一样的 。所以这里不值得优化,除非你觉得他会让你的代码更易读(对于final,static,及static final 变量同样适用).
5. 用静态代替虚拟
如果不需要访问某对象的字段,将方法设置为静态,调用会加速15%到20%。这也是一种好的做法,因为你可以通过方法声明知晓调用该方法不需要更新此对象的状态。
6. 避免内部的Getters/Setters
在源生语言像C++中,通常做法是用Getters(i=getCount())代替直接访问字段(i=mCount)。这是C++中一个好的习惯,因为编译器会内联这些访问,如果需要约束或者调试这些域的访问,你可以在任何时间添加代码。
Android中,这是个不好的想法。虚方法调用代价比直接存取字段高昂的多。按照通常面向对象语言的做法在公共接口中使用Getters和Setters是有原因的,但应该在一个经常访问其字段的类中采用直接访问。
无JIT时,直接字段访问大约比调用无关紧要的getter来访问快3倍。有JIT时(直接访问字段开销和访问局部变量是一样的),要快7倍。在Froyo版本中确实如此,但以后会在JIT中改进Getter方法的内联。
7. 对常量使用Static Final修饰符
考虑下面类首的声明:
static int intVal = 42;
static String strVal = "Hello, world!";


编译器生成一个类初始化方法clinit, 当类初次被使用时执行,这个方法将42存入intVal中,并得到类字符串常量strVal的引用。当这些值在后面被引用时,他们通过字段查找进行访问。
我们改进实现,采用 final关键字:
static final int intVal = 42;
static final String strVal = "Hello, world!";  


类不再需要clinit方法,因为常量进入了dex文件中的静态字段初始化器中。引用intVal的代码,直接调用整形值42,而访问strVal时也会采用相对开销较小的 string constant(字符串常量)指令替代字段查找。(这种优化仅仅是针对基本数据类型和String类型常量的,而非任意的引用类型。但尽可能的将常量声明为static final类型是一种好的做法。
8. 使用改进的For循环语法
改进的for循环(有时被称为for-each循环)能够用于实现了iterable接口的集合类及数组中。在集合类中,迭代器促使接口访问hasNext()和next()方法,在ArrayList中,计数循环迭代要快3倍(无论有没有JIT),但其他集合类中,改进的for循环语法和迭代器具有相同的效率。
这里有一些迭代数组的实现:static class Foo {
int mSplat;
}
Foo[] mArray = ...

public void zero() {
int sum = 0;
for (int i = 0; i mArray.length; ++i) {
sum += mArray.mSplat;
}
}

public void one() {
int sum = 0;
Foo[] localArray = mArray;
int len = localArray.length;

for (int i = 0; i len; ++i) {
sum += localArray.mSplat;
}
}

public void two() {
int sum = 0;
for (Foo a : mArray) {
sum += a.mSplat;
}
}
zero()是当中最慢的,因为对于这个遍历中的历次迭代,JIT不能优化获取数组长度的开销。
One()稍快,将所有东西都放进局部变量中,避免了查找。但仅只有数组长度促使了性能的改善。
Two()是在无JIT的设备上运行最快的,对于有JIT的设备则和one()不分上下。他采用了JDK1.5中的改进for循环语法。
结论:优先采用改进的for循环,但在性能要求苛刻的ArrayList迭代中考虑采用手写计数循环。

Tags:Android 应用程序 运行

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接