There are two basic rules for writing efficient code:
- Don't do work that you don't need to do.不要做你不需要做的。
- Don't allocate memory if you can avoid it.能不分配内存,尽量不要分配内存。
1.避免创建没用的对象
避免太多的创建短期临时对象,更少的对象创建意味着更少的垃圾收集,这对用户体验有直接的影响。
2.如果你不需要访问一个对象的字段,使您的静态方法。调用将快15% - -20%。也很好的做法,因为你可以告诉的方法签名,调用方法不改变对象的状态。
3.静态常量使用 static final(注意::这种优化仅适用于原始类型和字符串常量)
static final int intVal = 42;
static final String strVal = "Hello, world!";
4.避免内部的getter / setter,在一个class中的字段尽量直接访问,而不是调用getterXXX()之类的方法,
Without a
JIT:直接调用字段,会比调用
getter方法快3倍左右。
With the JIT:直接调用字段,会比调用getter方法快7倍左右。
知识点:JIT(where direct field access is as cheap as accessing a local)
5.使用更加高效的循环算法
static class Foo {
int mSplat;
}
Foo[] mArray = ...
public void zero() {
int sum = 0;
for (int i = 0; i < mArray.length; ++i) {
sum += mArray[i].mSplat;
}
}
public void one() {
int sum = 0;
Foo[] localArray = mArray;
int len = localArray.length;
for (int i = 0; i < len; ++i) {
sum += localArray[i].mSplat;
}
}
public void two() {
int sum = 0;
for (Foo a : mArray) {
sum += a.mSplat;
}
}
zero()
是最慢的,因为每次循环都调用了localArray.length;去判断字符串的长度
one()把计算长度单独剥离了出去
two(),它使用增强的for循环语法在版本1.5中引入
6.避免内部类调用外部类的私有方法
7.避免使用浮点型
在android设备上,浮点数大约比整数满2倍的性能。
8.了解并且多使用系统自带库的方法,在一般情况下效率比自己写得更高
9,小心使用
Native Methods(JNI)
一个是底层分配的内存不容易管理,而且Java与另外一种语言之间的调用会有额外的开销,还有一点是处理器架构不同可能需要编译多个版本的库文件