Android性能优化
Posted Jimy___Fight
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android性能优化相关的知识,希望对你有一定的参考价值。
android性能优化
【在Android项目过程中,为了使用户体验越来越良好,这时我们就需要对代码及各方面进行性能的优化了。由于做项目很忙,几乎没什么时间写博客。下面我就仅以我自己的个人理解和亲身项目经历来叙述Android性能优化方面的知识和理解吧。希望对大家有帮助!
当然,对于Android的性能优化,是各方各面的(比如Android系统本身的各种库类相对于ios系统来说都是有些差距的,相同内存下,Android可能会更卡顿一些....),可能我也写得不是很深入,而且排版比较凌乱,希望大家能多多理解。】
性能优化的概念
1.响应时间
响应时间是指用户从开始操作一直到系统给用户以正确反馈之间的时间差。一般包括 逻辑处理时间 + 网络传输时间 + 展现时间。对于非网络类应用不包括网络传输时间。展现时即网页或 App 界面渲染时间。
响应时间是用户对性能最直接的感受。
2.TPS
TPS(Transaction Per Second)
TPS为每秒处理的事务数,是系统吞吐量的指标,在搜索系统中也用QPS(Query Per Second)衡量。TPS一般与响应时间反相关。通常所说的性能问题就是指响应时间过长、系统吞吐量过低。对于后台开发来说,也常将高并发下内存泄漏归为性能问题。而对于移动开发来说,性能问题还包括电量、内存使用这两类较特殊情况。
性能优化方式
1. 降低执行时间
a.利用多线程并发或分布式提高 TPS
多线程并发或采用分布式来编程自然是比使用单线程要快得多。
b. 缓存(包括对象缓存、IO 缓存、网络缓存等)采用缓存可以比直接从网络上加载数据快捷方便,而且可以让用户第二次及之后加载内容数据时
不需要使用流量(因为第一次加载后,直接把数据存储在了设备上,这大大提升了用户体验),并且能大大加速Android设备显示内容,缓存
的话,我们可以使用三级缓存机制(这里就暂时不细说三级缓存了,有时间的时候再写篇博客,希望大家多多关注。)
c. 数据结构和算法优化
对于数据结构和算法优化这方面,相信不用我多说,大家也都可以理解的。记得大学老师告诉我们说,大学毕业时最好多去查看一下我们的
数据结构和算法分析这块的内容,熟悉这一块,至少能让你找的工作多1k,这句话是很有道理的。
(来个小插曲。大家都知道程序员是薪资相比于其他行业来说是相当高的了。然后就有下边的例子!)
1.对于普通的程序员来说,就是每天敲代码敲代码,然后薪资可能在13k左右。这个时候,专攻技术的程序员是很累的。而且几乎没什么属于
自己个人的业余时间。
2.对于进阶之后并且有了管理经验的程序员来说,这时候他可能是项目经理啊或者技术大牛之类的,这时候薪资比较让人仰望啦,薪资每月30k,
而人家对于数据结构啊算法优化这块已经做得挺牛逼的了。这个时候,有技术又有管理经验的程序员就比较轻松了,而且业余也是有蛮多个人时间的。
3.然后继续进阶上升好几个档次,数据结构啊算法分析啊,那都是小菜一碟,这时候被应聘进入天宫一号啊神州十号的研发,这个时候呢,
别人就基本不用敲代码了,当需要修改一行代码时可能就需要开一两个月的会议了,然后每天基本就是开会开会......(虽然有点夸张,但很现实)
所以说呢,数据结构和算法优化在编程的优化过程中还是相当重要的。打个比方,如果别人能用100行代码做到你1000行代码的功能,
你说谁的程序效率会更高?
d. 性能更优的底层接口调用,如 JNI 实现
JNI的引入,大大的提升了性能而且降低了很多时间,JNI的实现主要是通过底层的C或C++语言来编写一些重要的类库(一般里边可以写一
些实现功能的核心代码,然后生成.so文件,相比于反编译Java的.class文件,反编译.so文件可以说是几乎不可能完成的事。比如:
引入百度地图的一些.so文件,这就是通过JNI来实现的),我们知道,对比Java代码,使用C或C++编写出来的代码执行速度显然要快得多。
e. 逻辑优化
(略)
f. 需求优化
(略)
2.同步改异步
利用多线程提高TPS
3.提前或延迟操作
提前操作或延迟操作
提前操作:这是很好理解的,比如说当要加载大量的数据时,我们可以通过第一次用户登录使用时,在静态代码块中把所有数据加载出来,然后虽然第一次需要耗费大量的时间,可是之后的操作会顺畅好多,几乎可以很快速的显示出数据。这会给用户一个良好的体验。
延迟操作:延迟操作相对来说,从字面意思来说就比较难理解了,“延迟”是什么意思呢?等我一说,你就懂了。比如:我们要让后半段程序慢一些执行,Java中我们直接调用System.sleep(3000)(延迟3秒,注:这样是会报异常的),对于我们的Android编程来说,这样就有点low了,所以在Android中我们通常使用SystemClock.sleep(3000)。很好理解延迟操作吧?
Android性能优化
1.数据库性能优化
a.索引
通过索引优化概念
简单的说,索引就像书本的目录,目录可以快速找到所在页数,数据库中索引可以帮助快速找到数据,而不用全表扫描,合适的索引可以
大大提高数据库查询的效率。
优点
大大加快了数据库检索的速度,包括对单表查询、连表查询、分组查询、排序查询。经常是一到两个数量级的性能提升,且随着数据数量级增长。
缺点
索引的创建和维护存在消耗,索引会占用物理空间,且随着数据量的增加而增加。在对数据库进行增删改时需要维护索引,所以会对增删改的性能存在影响。
使用场景
当某字段数据更新频率较低,查询频率较高,经常有范围查询(>, <, =, >=, <=)或order by、group by发生时建议使用索引。并且选择度越大,
建索引越有优势,这里选择度指一个字段中唯一值的数量/总的数量。
经常同时存取多列,且每列都含有重复值可考虑建立复合索引
索引分类
直接创建索引和间接创建索引
直接创建: 使用sql语句创建,Android中可以在SQLiteOpenHelper的onCreate或是onUpgrade中直接excuSql创建语句,语句如
CREATE INDEX mycolumn_index ON mytable (myclumn)
间接创建: 定义主键约束或者唯一性键约束,可以间接创建索引,主键默认为唯一索引。
普通索引和唯一性索引
普通索引:CREATE INDEX mycolumn_index ON mytable (myclumn)
唯一性索引:保证在索引列中的全部数据是唯一的,对聚簇索引和非聚簇索引都可以使用,语句为
CREATE UNIQUE COUSTERED INDEX myclumn_cindex ON mytable(mycolumn)
单个索引和复合索引
单个索引:索引建立语句中仅包含单个字段,如上面的普通索引和唯一性索引创建示例。
复合索引:又叫组合索引,在索引建立语句中同时包含多个字段,语句如:CREATE INDEX name_index ON username(firstname, lastname)其中firstname为前导列。
聚簇索引和非聚簇索引(聚集索引,群集索引)
聚簇索引:物理索引,与基表的物理顺序相同,数据值的顺序总是按照顺序排列,语句为:
CREATE CLUSTERED INDEX mycolumn_cindex ON mytable(mycolumn) WITH ALLOW_DUP_ROW,
其中WITH ALLOW_DUP_ROW表示允许有重复记录的聚簇索引
非聚簇索引:CREATE UNCLUSTERED INDEX mycolumn_cindex ON mytable(mycolumn),索引默认为非聚簇索引
以上是关于Android性能优化的主要内容,如果未能解决你的问题,请参考以下文章