安卓应用优化篇

安卓应用优化篇

  • 类和对象使用技巧

    • 尽量少用new生成新对象

    • 使用clone方法生成新对象

    • 尽量使用局部变量栈变量

    • 减少方法调用

    • 使用final类和final/static/private方法

    • 让访问实例内变量的 getter/setter 方法变成final  

    • 避免不需要的 instanceof 操作  

    • 避免不需要的造型操作  

    • 尽量重用对象  

    • 不要重复初始化变量  

    • 不要过分创建对象

  • Java IO技巧

    • 使用缓冲提高IO性能

    • lnputStream比Reader高效,OutputStream比Writer高效

    • 在适当的时候用byte替代char

    • 有缓冲的块操作IO要比缓冲的流字符IO快

    • 序列化时使用原子类型

    • 在finally块中关闭stream

    • SQL语句

    • 尽早释放资源

  • 异常Exceptions使用技巧

    • 避免使用异常来控制程序流程

    • 尽可能重用异常

    • 将trycatch 块移出循环  

  • 线程使用技巧

    • 在使用大量线程Threading的场合使用线程池管理

    • 防止过多的同步

    • 同步方法而不要同步整个代码段

    • 在追求速度的场合用ArrayList和HashMap代替Vector和Hashtable

    • 使用notify而不是notifyAll

    • 不要在循环中调用 synchronized同步方法   

    • 单线程应尽量使用 HashMap,ArrayList

  • 其它常用技巧

    • 奇偶判断

    • 使用移位操作替代乘除法操作可以极大地提高性能

    • 对Vector中最后位置的添加删除操作要远远快于埘第一个元素的添加删除操作

    • 当复制数组时使用System.arraycop方法

    • 使用复合赋值运算符

    • 用int而不用其它基本类型

    • 在进行数据库连接和网络连接时使用连接池

    • 用压缩加快网络传输速度一种常用方法是把相关文件打包到一个jar文件中

    • 在数据库应用程序中使用批处理功能

    • 消除循环体中不必要的代码

    • 为vectors 和 hashtables定义初始大小  

    • 如果只是查找单个字符的话用charat代替startswith

    • 在字符串相加的时候使用 charat()代替startswith() 如果该字符串只有一个字符的话  

    • 对于 boolean 值避免不必要的等式判断  

    • 对于常量字符串用string 代替 stringbuffer   

    • 用stringtokenizer 代替 indexof 和substring  

    • 使用条件操作符替代if cond else  结构

    • 不要在循环体中实例化变量  

    • 确定 stringbuffer的容量  

    • 不要总是使用取反操作符  

    • 与一个接口 进行instanceof 操作  

    • 采用在需要的时候才开始创建的策略  

    • 通过 StringBuffer 的构造函数来设定他的初始化容量可以明显提升性能  

    • 合理使用 javautilVector

    • 不要将数组声明为public static final

    • HaspMap 的遍历

    • array数组和 ArrayList 的使用  

    • StringBufferStringBuilder 的区别

    • 尽量使用基本数据类型代替对象   

    • 用简单的数值计算代替复杂的函数计算比如查表方式解决三角函数问题  

    • 使用具体类比使用接口效率高但结构弹性降低了但现代 IDE都可以解决这个问题

    • 考虑使用静态方法

    • 应尽可能避免使用内在的GET/SET 方法

    • 避免枚举浮点数的使用   

    • 二维数组比一维数组占用更多的内存空间大概是 10倍计算

    • SQLite

实际上,Android本身的Training文档也提供给我们很多可参考的内容,以下仅枚举一些KeyPoint,当然,有的内容是与上面的策略是重复的。
原文参考:Performance Tips
译文参考:android应用开发者指南:性能优化(1)
其它参考:Android开发性能优化简介
总体上来说,想要写出高效代码,我们要遵循两条基本的原则:

  • 不作没有必要的工作。

  • 尽量避免内存分配。

Key Point:

  • 避免创建不必要的对象

  • 用静态代替虚拟

  • 避免内部的Getters/Setters

  • 对常量使用Static Final修饰符

  • 使用改进的For循环语法(for-each)

  • 在有内部类的情况考虑使用包权限来替代私有访问

  • 避免使用浮点数

  • 了解并使用类库

  • 合理利用Native方法


通用Android性能优化
布局优化
(原文参考:ImprovingLayout Performance)

  • 尽量减少Android程序布局中View的层次,View层次越多,效率就越低

  • 使用<include/>复用布局

  • 使用ViewStub懒加载布局 (TODO:Android布局技巧:使用ViewStub提高UI性能)

  • 使用ViewHolder、Thread使ListView滚动更加流畅

其它优化点

  • 合理使用异步操作

  • 懒加载:当前不需要的数据,不要加载,即按需加载。懒加载的范围是广泛的,可以是数据,可以是View,或者其它

  • 使用缓存

    • 图片缓存:包括MemoryCache和DiskCache,推荐使用官方DEMO中的Cache

参考:DisplayingBitmaps Efficiently

  • 单例数据缓存:建立一个管理数据的类,管理所有数据,当主界面消失后,由于Application本身没有实际退出,因此,数据本身也没有释放掉,下次启动时,省去了加载数据的时间,当然,这并不是一个好的行为。

  • 使用ListView、GridView的View缓存

  • 使用Message自身的缓存,避免重复创建Message实例

  • 线程池

  • 数据池(可参考Message Pool的实现方式)

  • ……

  • 数据库优化

    • SQL优化

    • 建立索引

    • 使用事务

    • ……

  • 算法优化

    • 用快速排序代替冒泡排序

    • 用二分查找代替线性查找

    • ……

  • 数据结构使用

    • 合理使用HashMap、HashSet来提高查找性能

    • 使用SparseArray、SparseIntArray、SparseBooleanArray来替代某些特定的HashMap

    • ……

    • 不要全部使用ArrayList,合理使用LinkedList等易于插入和删除的集合

  • 其它策略

    • 可以考虑延迟处理,避免在同一时间干过多的事情

应用程序内部的性能优化       该部分的优化应该是依据程序的不同而不同,没有万般皆准的法则,目前从我做过的程序来看,实际上,上述的性能优化点基本上已经能够解决很多性能问题了。
在我所做的程序中,主要的优化手段是:

  • 程序逻辑简化:分析代码,去掉冗余逻辑

  • 数据结构的优化:对集合类的灵活使用,特别是HashMap的使用,极大的提高查找性能。

  • 批量处理原则:对于需要循环调用地方,采用批量处理

总结
          性能优化本身是对代码的重构和反思过程,通过优化性能,能找出我们很多设计、逻辑上的不足。
          优化的过程往往很痛苦,但在做过这个过程后,个人在编程水平、设计水平上都会有很大的提高。
          很多优化的思想应该做为编码规范的一部分,需要我们反复实践,在写代码时,第一反应所得出的代码就是最优的。

转载于:https://my.oschina.net/mengfanlu/blog/333145

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/109695.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • 设置时区定位可以关闭吗_监控时区设置是什么意思

    设置时区定位可以关闭吗_监控时区设置是什么意思mysql的驱动jar包升级到了8.0版本以上。升级后从mysql中查出的时候,全都比数据库的时间多13小时,而且这些时间存到数据库的时间,有些是正确的时间,有时比正确时间少13小时,这样返回给前端的时间就不准确,解决这个问题只要在springboot的数据库连接配置中增加一段配置就能解决问题。这个时区要设置好,不然会出现时差,如果你设置serverTimezone=UTC,连接不报错,但是我们在用java代码插入到数据库时间的时候却出现了问题。比如在java代码里面插入的时间为:2021-0.

  • es面试题及答案_elk面试题

    es面试题及答案_elk面试题文章目录1、Elasticsearch了解多少,说说你们公司ES的集群架构,索引数据大小,分片有多少,以及一些调优手段。2、Elasticsearch的倒排索引是什么?3、Elasticsearch索引数据多了怎么办,如何调优,部署?4、Elasticsearch是如何实现master选举的?5、详细描述一下Elasticsearch索引文档的过程。6、详细描述一下Elasticsearch搜索的过程?7、Elasticsearch在部署时,对Linux的设置有哪些优化方法?8、lucence内部结构是什

  • sql注入攻击属于什么攻击_ssr怎么用

    sql注入攻击属于什么攻击_ssr怎么用学好网络安全,以己之矛护己之盾

  • 转载::深入研究DataList分页方法

    转载::深入研究DataList分页方法

  • CANoe与CANalyzer工具的区别

    CANoe与CANalyzer工具的区别CANoe与CANalyzer工具的区别

  • C语言xml配置文件换行的方法[通俗易懂]

    C语言xml配置文件换行的方法[通俗易懂]/options参数设定成XML_PARSE_NOBLANKS,否则的话是不会在结点后面添加回车的。/doc=xmlReadFile(docname,“UTF-8”,XML_PARSE_NOBLANKS);//读取xml文件时忽略空格/把xmlSaveFormatFile的format参数修改成1,否则在使用xmlReadFile打开的xml文件时,在生成的xml文件里是会把所有的结点都放到一行里显示。/xmlSaveFormatFile(docname,doc,1);以上内容

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号