安卓应用优化篇

安卓应用优化篇

  • 类和对象使用技巧

    • 尽量少用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

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

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

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • python爬虫基础源代码

    python爬虫基础源代码1.简单爬取百度网页内容:爬取百度网页源代码:importrequestsr=requests.get(“http://www.baidu.com”)r.status_coder.encodingr.encoding=r.apparent_encodingr.text结果展示:2.爬取网页的通用代码框架:(这里继续选用百度网页)爬取网页的通用代码框架importrequestsdefgetHTMLText(url):try:r=reques

    2022年5月3日
  • java 遍历arrayList的四种方法及其效率对比

    java 遍历arrayList的四种方法及其效率对比java遍历arrayList的四种方法packagecom.test;importjava.util.ArrayList;importjava.util.Iterator;importjava.util.List;publicclassArrayListDemo{   publicstaticvoidmain(Str

    2022年7月22日
  • 自定义类加载器加载jar包_类加载器的可见性

    自定义类加载器加载jar包_类加载器的可见性spring根本不会去管自己被放在哪里,它统统使用TCCL来加载类,而TCCL默认设置为了WebAppClassLoader,也就是说哪个WebApp应用调用了spring,spring就去取该应用自己的WebAppClassLoader来加载bean。这在真正理解线程上下文类加载器(多案例分析)中已有详细描述。因此,为了使spring使用自定义的类加载器进行加载,需要开一个线程,将这个线程的类加载器设置为自定义类加载器。publicStringtest(){try{

    2022年9月5日
  • 用状态空间法求猴子香蕉问题_猴子摘香蕉状态空间图

    用状态空间法求猴子香蕉问题_猴子摘香蕉状态空间图猴子和香蕉问题(monkeyandbananaproblem)在一个房间内有一只猴子(可把这只猴子看做一个机器人)、一个箱子和一束香蕉。香蕉挂在天花板下方,但猴子的高度不足以碰到它。那么这只猴子怎样才能摘到香蕉呢?图2.1.1表示出猴子、香蕉和箱子在房间内的相对位置。用一个四元表列(W,x,Y,z)来表示这个问题的状态,其中W-猴子的水平位置x-当猴子在箱子顶上时取x=1;否则取x=0Y-箱…

    2022年9月26日
  • char型和int型数据可以相互转换_c语言强制类型转换用法

    char型和int型数据可以相互转换_c语言强制类型转换用法char转intchar与int的相互转化,联想ASCII码,字符‘0’对应的值为48,所以不能直接加减‘’charch=’9′;intch_int=ch-‘0′;//此时ch_int=9int转charinti=9;chari_ch=i+’0’;//此时i_ch=’9’必须记住的几个ASCII值字符值ASCII值‘0’48…

    2022年10月2日
  • keras卷积层_keras实现全卷积神经网络

    keras卷积层_keras实现全卷积神经网络分组卷积在pytorch中比较容易实现,只需要在卷积的时候设置group参数即可比如设置分组数为2conv_group=nn.Conv2d(C_in,C_out,kernel_size=3,stride=3,padding=1,groups=2)但是,tensorflow中目前还没有分组卷积,只能自己手动编写分组卷积函数。在编写程序之前大家要先理解分组卷积的形式,也就是对特征图在通道上进行划分,例如设置group=3,对输入特征图通道划分成三组,输出特征图也要划分成3组,再对三组输入输出特

    2022年10月30日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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