您的位置:首页 > 编程语言

性能优化-代码-tips

2016-07-02 13:17 302 查看
基本原则:

1 Don't do work that you don't need to do

2 Don't allocate memory if you can avoid it.

此两项原则可以用一句话来概括:不要为写代码而写代码。这也是《高效java》中所首先提到的。

1 常量定义:

static final String strVal = "Hello, world!";
理解:通俗理解,不加final,该变量在初始化之后是允许被修改的,而加final就不允许了。那么这个效率差别就在于允许修改的时候要多做一些事情,<clinit>,final可以减少中间的环节。

2 Getters/Setters

理解:用与不用不能一概而论,一个变量的访问多出两个方法,势必会多出一些处理,比如必然会多查询方法表的操作。但也有其他角度,比如只能获取不能修改,或者代码规范的角度。需要注意的是,我们肯定不希望看到Getters或Setters存在于循环当中,毕竟3到7倍的效率差肯定是存在的。

3 增强for

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肯定是不推荐的。one和two在jit设备上差不多,但在非jit设备上two是最快的。所以肯定推荐使用two。

4 内部类访问外部私有成员或方法

public class Foo {
private class Inner {
void stuff() {
Foo.this.doStuff(Foo.this.mValue);
}
}

private int mValue;

public void run() {
Inner in = new Inner();
mValue = 27;
in.stuff();
}

private void doStuff(int value) {
System.out.println("Value is " + value);
}
}


理解:VM并不支持内部类调用外部私有成员但java允许,一旦调用一次外部私有方法,就会对应生成一个静态方法用于弥补这个不同。除非对权限有特殊要求,比如编写sdk,或是团队规范,尽量不要让多余的静态方法产生。推荐解决办法是,让doStuff()方法变成包权限。

5 final修饰的类

理解:final修饰的类首先是不能被继承的,也代表其中的方法不能被继承。这一点在写库的时候是优先要考虑的。另外,在效率上加不加final肯定会有微小的差异。

6 Collections.emptyList()

final class TestAdapter extends RecyclerView.Adapter{
private List<Model> list = Collections.emptyList();

public TestAdapter() {
}

public void setItems(List<Model> l) {
list = l;
notifyDataSetChanged();
}

......
}
理解:Collections.emptyList()可以让setItems方法省去了判空操作,但需注意在实际业务中,它不能作为一个正常的List来使用,把它看作占位在常用情况下也是可以的。

7 bindview

在使用RecyclerView时要用到Adapter,在adapter中的bindview里尽量避免复杂的逻辑,或是new什么东西。因为在滑动的过程中,它会被调用很多次,次次都去计算、执行复杂逻辑或是new操作在某些情况下会影响界面的渲染。而尽量把这一些东西都拿到adapter外面去做,比如RecyclerView包含RecyclerView,可以在页面加载时先初始化好layoutmanager以及decoration;甚至小到new一个onClickListener都是可以把其拿到外面。

8 可变参数

可变参数实际上是在调用时生成相应数量的数组用于存放多个参数,反复调用需谨慎:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: