a284628487 / AndroidPoint

Android Note
1 stars 0 forks source link

Performance tips #1

Open a284628487 opened 6 years ago

a284628487 commented 6 years ago

https://developer.android.com/training/articles/perf-tips

a284628487 commented 6 years ago

http://blog.csdn.net/innost/article/details/9008691

a284628487 commented 6 years ago

性能优化

选择正确的算法和数据结构,是最优的优化方案。其次一些编码习惯,也可以进行纠正。 两个最基本的原则:

  1. Don't do work that you don't need to do.
  2. Don't allocate memory if you can avoid it.

Avoid creating unnecessary objects

避免创建不必要的对象 创建对象实例之后,当对象不再被引用,则会被回收,如果创建大量的对象,则将频繁的触发垃圾回收方法。 垃圾回收的时候,所有线程进行暂停状态,势必影响应用流畅性。

  1. 如果有一个返回String的方法,我们都知道,返回的结果始终将被append到一个StringBuffer,所以可以改变函数的实现,直接append字符串,而不是创建一个短时的临时对象。
  2. 字符串截取,使用substring方法,创建的String对象将和原始数据共享char[]数组。
  3. int[]比Integer[]更高效
  4. 如果要创建容器存储Foo, Bar,则两个数组Foo[]和Bar[]带来的效率提升要比单个数组同时存储Foo和Bar要好。

Prefer static over virtual

如果某个方法不涉及到访问该对象的属性,则应该把该方法定义成静态方法,这样调用将带来15%-20%的速度提升。

Use static final for constants

static int intVal = 42;
static String strVal = "Hello, world!";
  1. 编译器为每个类生成了类初始化方法,当类被第一次用到的时候被调用,此时将intVal赋值为42,并且从string常量表中申请一块区域存放"Hello, world!",然后赋值给strVal。
  2. 如果字段在程序运行期间保持不变,则可以使用 "final" 关键字来定义常量。 此时类将不需要方法,因为此时常量已经在编译阶段就被编译到dex文件中,intVal将直接被替换为42。

Use enhanced for loop syntax

增强for循环

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

public void one() {
    int sum = 0;
    int len = mArray.length;
    for (int i = 0; i < len; ++i) {
        sum += mArray[i].mSplat;
    }
}

public void two() {
    int sum = 0;
    for (Foo a : mArray) {
        sum += a.mSplat;
    }
}

zero()最慢,每次循环都将获取一次数组长度,one()快一些,tow()最快。

Consider package instead of private access with private inner classes

避免直接使用内部类访问外部类成员变量。

Know and use the libraries

库方法的使用,典型的例子就是String.indexOf()及相关的方法,Dalvik将会做一些优化,所以我们如果自己定义方法实现类似的功能,则效率上将有所降低。 同样的,System.arraycopy()方法,相比起手写loop循环copy赋值操作,将带来9位的效率提升。

Performance myths

集合容器类,尽量定义明确的类型,比如调用一个明确了类型的HashMap@map的代价,相比起调用一个非明确类型的Map@map的代价要低。