Android性能优化
2016-05-25 16:46
260 查看
一、内存优化
1、public static final 代替enum
使用枚举通常会比使用静态常量要消耗两倍以上的内存,在Android开发当中我们应当尽可能地不使用枚举。(参http://developer.android.com/training/articles/memory.html#Overhead)任何一个Java类,包括内部类、匿名类,都要占用大概500字节的内存空间。
(char 1 short 2 int、float、long 4 double 8)任何一个类的实例要消耗12-16字节的内存开支,因此频繁创建实例也是会一定程序上影响内存的。
2、SparseArray替代HashMap
主要是因为SparseArray不需要对key和value进行auto- boxing(将原始类型封装为对象类型,比如把int类型封装成Integer类型),结构比HashMap简单(SparseArray内部主要使用 两个一维数组来保存数据,一个用来存key,一个用来存value)不需要额外的额外的数据结构(主要是针对HashMap中的HashMapEntry
而言的)使用 SparseArray 的确比 HashMap 节省内存,大概节省 35%左右的内存。总体而言,在Android这种内存比CPU更金贵的系统中,能经济地使用内存还是上策,何况SparseArray在其他方面的表现也不算差(另外,SparseArray删除数据的时候也做了优化——使用了延迟整理数组的方法,可参考官方文档SparseArray,读者可以自行把代码9中的hash.get和sparse.get改成hash.remove和sparse.delete试试,你会发现二者的性能相差无几) http://www.open-open.com/lib/view/open1402906434918.html
3、使用StringBuffer或者StringBuilder来拼接,而不是加号连接符
使用加号连接符会创建多余的对象,拼接的字符串越长,加号连接符的性能越低。
用String+=拼接字符串的时间27468
用String=String+拼接字符串的时间25813
用String.concat拼接字符串的时间12265
用StringBuffer.append拼接字符串的时间14
用StringBuilder.append拼接字符串的时间8
String类本身是final类型,字符串拼接时,会使用StringBuffer,并调用append,之后再调用toString方法。
而StringBuffer转换成String时,开销相当大。中间不仅创立了临时对象StringBuffer,还每次完后再要转成String。
5、使用LeakCanary优化内存泄漏
eclipse见博客http://blog.csdn.net/liudehuaii18/article/details/46287695
https://github.com/teffy/LeakcanarySample-Eclipse
1、public static final 代替enum
使用枚举通常会比使用静态常量要消耗两倍以上的内存,在Android开发当中我们应当尽可能地不使用枚举。(参http://developer.android.com/training/articles/memory.html#Overhead)任何一个Java类,包括内部类、匿名类,都要占用大概500字节的内存空间。
(char 1 short 2 int、float、long 4 double 8)任何一个类的实例要消耗12-16字节的内存开支,因此频繁创建实例也是会一定程序上影响内存的。
2、SparseArray替代HashMap
主要是因为SparseArray不需要对key和value进行auto- boxing(将原始类型封装为对象类型,比如把int类型封装成Integer类型),结构比HashMap简单(SparseArray内部主要使用 两个一维数组来保存数据,一个用来存key,一个用来存value)不需要额外的额外的数据结构(主要是针对HashMap中的HashMapEntry
而言的)使用 SparseArray 的确比 HashMap 节省内存,大概节省 35%左右的内存。总体而言,在Android这种内存比CPU更金贵的系统中,能经济地使用内存还是上策,何况SparseArray在其他方面的表现也不算差(另外,SparseArray删除数据的时候也做了优化——使用了延迟整理数组的方法,可参考官方文档SparseArray,读者可以自行把代码9中的hash.get和sparse.get改成hash.remove和sparse.delete试试,你会发现二者的性能相差无几) http://www.open-open.com/lib/view/open1402906434918.html
3、使用StringBuffer或者StringBuilder来拼接,而不是加号连接符
使用加号连接符会创建多余的对象,拼接的字符串越长,加号连接符的性能越低。
用String+=拼接字符串的时间27468
用String=String+拼接字符串的时间25813
用String.concat拼接字符串的时间12265
用StringBuffer.append拼接字符串的时间14
用StringBuilder.append拼接字符串的时间8
String类本身是final类型,字符串拼接时,会使用StringBuffer,并调用append,之后再调用toString方法。
而StringBuffer转换成String时,开销相当大。中间不仅创立了临时对象StringBuffer,还每次完后再要转成String。
5、使用LeakCanary优化内存泄漏
eclipse见博客http://blog.csdn.net/liudehuaii18/article/details/46287695
https://github.com/teffy/LeakcanarySample-Eclipse
相关文章推荐
- Android常用英文词汇
- Android 快速开发框架:推荐10个框架:afinal、ThinkAndroid、andBase、KJFrameForAndroid、SmartAndroid、dhroid..
- 【Android】24、如何随时随地退出程序
- (4.1.20)android的样式(style)与主题(theme)
- android N 分屏
- Android studio JavaDoc的使用
- Android之Adapter用法总结
- Android AudioManager类(必看)
- view坐标_ _ Android应用坐标系统全面详解
- Android drawable文件使用(一)layer-list
- AsyncTask 坑 (二) AsyncTask对象生命周期
- 关于Android中设置闹钟的相对完善的解决方案
- android listview与adapter用法
- 详解Android TabHost的多种实现方法 附源码下载
- Android 自定义View 让内容跟随手指滚动
- Android的拍照功能
- Android端 WebP图片压缩与传输的一点探索
- Android设计中如何切图.9.png(点9图)
- android KTV 开发(一)自定义videoView 实现视频大小自由缩放、全屏与预览
- android刷新媒体库