安卓应用优化篇

  • 类和对象使用技巧
    • 尽量少用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的使用,极大的提高查找性能。
  • 批量处理原则:对于需要循环调用地方,采用批量处理

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

时间: 2024-08-05 16:38:55

安卓应用优化篇的相关文章

画图工具之优化篇

import java.awt.BasicStroke; import java.awt.Color; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; /** * 1.新建一个LoginListener事件处理类, * 该类实现M

安卓性能优化 视频

韩梦飞沙  韩亚飞  [email protected]  yue31313  han_meng_fei_sha 安卓-性能优化之内存泄漏-原创-高清视频-爱奇艺 ========= Android手机内存管理与性能优化视频教程下载 下载:http://pan.baidu.com/s/1skkSdI1密码:kdcs 01.Dalvik介绍及其优势和文件格式 02.基于栈与基于寄存器比较 03.DEX与ODEX文件格式和ODEX化详解 04.GC垃圾回收机制 05.内存监测分析工具DDMS介绍 0

nginx优化篇之Linux 内核参数的优化

原博客地址(欢迎访问):http://www.loveyqq.tk/blog/2014/05/27/nginxyou-hua-pian-zhi-linux-nei-he-can-shu-de-you-hua/ 由于默认的Linux内核参数考虑的是最通用的场景,这明显不符合用于支持高并发访问的Web服务器的定义,所以需要修改Linux内核参数,使得Nginx可以拥有更高的性能. 在优化内核时,可以做的事件很多,不过,我们通常会根据业务特点来进行调整,当Nginx作为静态Web内容服务器.反向代理服

Juniper老司机经验谈(SRX防火墙优化篇)视频课程上线了

大家在QQ群.论坛里经常提的问题,许多人对SRX双机不是很理解,实际工作中碰见太多问题,惹出了少少麻烦. 针对这个我录制了一个Juniper老司机经验谈(SRX防火墙优化篇)视频课程,上线了.只有9块钱,象征性收费,几天卖出了50多份. 主要内容如下: 1 juniper模拟器使用(windows篇) [免费观看] 40分钟 本章节介绍windows环境下,juniper模拟器的部署.为学习实验做好准备. 2 juniper模拟器使用(MAC篇) 17分钟 本章节介绍在MAC BOOK下,jun

全文检索之lucene的优化篇--创建索引库

在上一篇HelloWorld的基础上,建立一个directory的包,添加一个DirectoryTest的测试类,用来根据指定的索引目录创建目录存放指引. DirectoryTest类中的代码如下,基本上就是在HelloWorld的基础上改改就可以了. 里面一共三个方法,testDirectory(),测试创建索引库;testDirectoryFSAndRAM(),结合方法1的两种创建方式,优化;testDirectoryOptimize(),在方法2个基础上,研究索引的优化创建,减少创建的索引

全文检索之lucene的优化篇--分词器

在创建索引库的基础上,加上中文分词器的,更好的支持中文的查询.引入jar包je-analysis-1.5.3.jar,极易分词.还是先看目录. 建立一个分词器的包,analyzer,准备一个AnalyzerTest的类.里面的代码如下,主要写了一个testAnalyzer的方法,测试多种分词器对于中文和英文的分词;为了可以看到效果,所以写了个analyze()的方法,将分词器和text文本内容传入,并将分词的效果显示出来. package com.lucene.analyzer; import

Android 优化篇

http://my.oschina.net/u/586684/blog/207844 1. 使用保守的Service 2. 当视图变为隐藏状态后释放内存: 当用户跳转到不同的应用并且你的视图不再显示时, 你应该释放应用视图所占的资源. 这时释放所占用的资源能显著的提高系统的缓存处理容量, 并且对用户的体验质量有直接的影响. 使用优化后的数据容器: 比如 SparseArray, SparseBooleanArray 和 LongSparseArray. 传统的 HashMap 在内存上的实现十分

【转】Android性能优化之布局优化篇

转自:http://blog.csdn.net/feiduclear_up/article/details/46670433 Android性能优化之布局优化篇 分类: andorid 开发2015-06-29 16:28 238人阅读 评论(0) 收藏 举报 性能布局viewStubinclude布局优化 目录(?)[-] Hierarchy View检测布局嵌套层次 显示GPU过度绘制 懒加载布局 ViewStub Android Lint 工具 怎样才能写出优秀的Android App,是

全文检索之lucene的优化篇--增删改查

主要介绍增删改查索引的功能,并且对于查询到的关键字,返回高亮的结果.高亮的效果,就是将查询出来的结果,在前后加上标签,<font color="red">和</font>这样在浏览器显示的就是红色的字体. 目录效果如上,建立一个com.lucene的包,建立一个IndexDao的类,里面写入索引的增删改查方法;而建立的IndexDaoText类则是对这增删改查的测试;QueryResult则是一个查询结果的类,里面只有2个字段,总记录数和记录集合. 其中Inde