[置顶] android性能优化

时间:2022-12-09 20:11:27

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性能优化