性能优化-代码-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 常量定义:
2 Getters/Setters
理解:用与不用不能一概而论,一个变量的访问多出两个方法,势必会多出一些处理,比如必然会多查询方法表的操作。但也有其他角度,比如只能获取不能修改,或者代码规范的角度。需要注意的是,我们肯定不希望看到Getters或Setters存在于循环当中,毕竟3到7倍的效率差肯定是存在的。
3 增强for
理解:zero肯定是不推荐的。one和two在jit设备上差不多,但在非jit设备上two是最快的。所以肯定推荐使用two。
4 内部类访问外部私有成员或方法
理解:VM并不支持内部类调用外部私有成员但java允许,一旦调用一次外部私有方法,就会对应生成一个静态方法用于弥补这个不同。除非对权限有特殊要求,比如编写sdk,或是团队规范,尽量不要让多余的静态方法产生。推荐解决办法是,让doStuff()方法变成包权限。
5 final修饰的类
理解:final修饰的类首先是不能被继承的,也代表其中的方法不能被继承。这一点在写库的时候是优先要考虑的。另外,在效率上加不加final肯定会有微小的差异。
6 Collections.emptyList()
7 bindview
在使用RecyclerView时要用到Adapter,在adapter中的bindview里尽量避免复杂的逻辑,或是new什么东西。因为在滑动的过程中,它会被调用很多次,次次都去计算、执行复杂逻辑或是new操作在某些情况下会影响界面的渲染。而尽量把这一些东西都拿到adapter外面去做,比如RecyclerView包含RecyclerView,可以在页面加载时先初始化好layoutmanager以及decoration;甚至小到new一个onClickListener都是可以把其拿到外面。
8 可变参数
可变参数实际上是在调用时生成相应数量的数组用于存放多个参数,反复调用需谨慎:
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 可变参数
可变参数实际上是在调用时生成相应数量的数组用于存放多个参数,反复调用需谨慎:
相关文章推荐
- 将JAVA文件从GBK转UTF8批量操作
- 【GOF23设计模式】_状态模式_UML状态图_酒店系统房间状态_线程对象状态切换JAVA250
- 在Eclipse中安装Zookeeper状态查看插件
- SpringMvc父子容器
- ireport、jasperreport报错信息
- Pycharm下的Anaconda配置
- Mac管理多个Java版本
- java常量池技术
- 一些常用封装的PHP函数
- 深入理解java异常处理机制
- 【Struts2实现文件上传】struts2上传文件异常总结及解决方式
- 《Java JD7 学习笔记》课后练习题4
- Matlab中dir命令
- mongo集群分片
- 一个Java对象到底占多大内存?
- matlab中sortrows的用法
- python2.x代码自动转换成python3.x
- Spring Hibernate JPA 联表查询 复杂查询
- Vector和Stack分析
- IEEE POSIX 标准