1、SparseArray替代HashMap<Integer,Object>
好处是省内存,然后不用装箱,查找效率没有hashmap高,如果数量大的情况下会比hashmap慢50%,数量在1000内的时候比较适合用,参考
http://liuzhichao.com/p/832.html
http://android-performance.com/android/2014/02/10/android-sparsearray-vs-hashmap.html
http://*.com/questions/25560629/sparsearray-vs-hashmap相关的还有SparseLongArray可以代替HashMap<Integer,Long>,同理还有SparseBooleanArray,SparseIntArray
还有LongSparseArray,注意这里和SparseLongArray不一样哦,LongSparseArray<T>是用来代替HashMap<Long,T>的,但是LongSparseArray需要API16(也就是4.1以后的),当然supportv4里面有个替代品LongSparseArray可以用。
2、用一维数组代替多维数组
多维数组占的内存空间会多很多,效率也低
关于数组的内存空间可以参考
http://www.javamex.com/tutorials/memory/object_memory_usage.shtml 介绍JAVA对象的内存占用
http://www.javamex.com/tutorials/memory/array_memory_usage.shtml介绍JAVA数组的内存占用
3、布局方面使用merge、include、viewstub
viewstub可以延迟渲染,对于非立刻需要显示的界面可以使用viewstub,在真正需要的时候才渲染
4、Message不new,用handler.obtainMessage()
Message内部有个静态缓存池是链表结构的,obtain实际上就是把链表的头部元素摘下来
5、空闲时预读
在空闲时对获取成本较高的数据(如要读取本地或网络资源)进行预读是提高性能的有效手段。为了给用户带来更好的交互体验,提高响应性,很多网络应用(如新闻阅读类应用)都在启动的时候进行预读,把网络数据缓存到sdcard或者内存中。
http://blog.csdn.net/mylzc/article/details/6802935
6、内存间传数据用Parcelable,需保存或网络传数据用Serializable
Parcelable的性能比Serializable好,在内存开销方面较小,所以在内存间数据传输时推荐使用Parcelable,如activity间传输数据,而Serializable可将数据持久化方便保存,所以在需要保存或网络传输数据时选择Serializable,因为android不同版本Parcelable可能不同,所以不推荐使用Parcelable进行数据持久化
7、图片压缩
加载图片前,先预估图片大小,ImageView大小,进行适当压缩,通过设置BitmapFactory.Options中inSampleSize的值就可以实现
http://blog.csdn.net/guolin_blog/article/details/9316683
8LruCache管理内存,DiskLruCache管理磁盘
9通过广播需要获取当前的电量等级,当电池电量低于某一个级别的时候,您的应用程序应当降低后台服务的更新频率来尽量减小电量的消耗
10使用RelativeLayout代替嵌套LinearLayouts,尽可能保持“扁平化”布局,减少创建的对象数量
11反射效率低,所以可以在静态代码块里调用Class.forName和Class.getMethod来确认方法是否存在,如果性能要求不高那直接用Method.invoke好了。
12.使用sqlite的时候用ContentValue或者compileStatement来会提高效率,减少编译次数(android性能优化P24)
13、使用较小的数据类型来操作一般情况下会提高效率,但是也不是完全这样,如果小于寄存器的位数,反而会引入额外指令(比如类型转化)
14、short排序的速度比远远快于int和long,因为他使用的不是快排而是计数排序,复杂度为Ο(n+k)(其中k是整数的范围),快于任何比较排序算法,short范围是-32768~32767
http://www.cnblogs.com/kaituorensheng/archive/2013/02/23/2923877.html
15、JNI访问java对象或类的成员和方法需要获取jfieldID,在类加载的时候就获取所有id会提高效率(android性能优化P51)
16 、某些时候,应用如果没有在前台可以注销广播以减少功耗,在onPause里注销,在onResume里注册
17、foreach方式最好不要再ArrayList内使用,因为他本质上使用iterator方式,不如常规for循环效率高
参考文献
android性能优化