Android代码优化技巧.docx

  1. 1、本文档共28页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Android代码优化技巧

Android代码优化技巧Email: mailto:joyfly2006@joyfly2006@QQ:448086006Android的Dalvik VM在基础方面和Sum JVM没有什么大的区别,仅仅是字节码的优化,我们要知道什么时候用gc,什么时候用recycle以及到底用不用finalization,因为java对内存的分配只需要new开发者,而不需要显示的释放内存,但是这样造成的内存泄露问题的几率反而更高。对于占用资源的系统,有两条基本原则:不要做不必要的事,不要分配不必要的内存? ?不管VM是否支持实时(JIT)编译器(它允许实时地将Java解释型程序自动编译成本机机器语言,以使程序执行的速度更快。有些 JVM包含JIT编译器),下面提到的这些原则都是成立的。 避免建立对象世界上没有免费的对象。虽然GC为每个线程都建立了临时对象池,可以使创建对象的代价变得小一些,但是分配内存永远都比不分配内存的代价大。? 除非必要,应尽量避免尽力对象的实例。例如:int数组比Integer数组好,同理,这适用于所有的基本类型;两个平行的int数组比 (int,int)对象数组性能好。总体来说,避免创建短命的临时对象。减少对象的创建就能减少垃圾收集,进而减少对用户体验的影响。 使用本地方法?在处理字串的时候,不要吝惜使用String.indexOf(), String.lastIndexOf()等特殊实现的方法(specialty methods)。这些方法都是使用C/C++实现的,比起Java循环快10到100倍。 使用实现类比接口好Map?myMap1?=?new?HashMap(); //接口HashMap?myMap2?=?new?HashMap(); //实现类在没有JIT的设备上,调用方法所传递的对象采用具体的类型而非接口类型会更高效(比如,HashMap?map比Map map调用一个方法的开销小,尽管两个map都是HashMap),调用一个接口的引用会比调用实体类的引用多花费一倍的时间。而有JIT时这两种调用的效率不相上下。备注:使用实现类后影响了替换功能,不便于后续扩展。 避免内部的getter/setter方法在源生语言像C++中,通常做法是用Getters(i=getCount())代替直接字段访问(i=mCount)。这是C++中一个好的习惯,因为编译器会内联这些访问。而在Android中,这不是一个好的做法。虚方法调用的代价比直接字段访问高昂许多。在通用的接口定义中,可以依照OO的方式定义getters和setters,但是在一般的类中,你应该直接访问变量。无JIT时,直接字段访问大约比调用getter访问快3倍。有JIT时(直接访问字段开销等同于局部变量访问),要快7倍。备注:如果直接访问类的成员变量则影响其封装性。 谨慎使用改进的For循环语法 改进的for循环能够用于实现了iterable接口的集合类及数组中。在集合类中,迭代器让接口调用iterable接口的hasNext()和next()方法。在ArrayList中,手写的计数循环迭代要快3倍,但其他集合类中,改进的for循环语法和迭代器具有相同的效率。这里有一些迭代数组的实现: ?zero()是最慢的,因为对于这个遍历中的历次迭代,JIT并不能优化获取数组长度的开销。One()稍快,声明数组长度,避免了查找,对性能改善有益(手写计数循环)。Two()是在无JIT的设备上运行最快的,对于有JIT的设备则和one()不分上下。他采用了JDK1.5中的改进for循环语法。结论:优先采用改进for循环,但在性能要求苛刻的ArrayList迭代中,考虑采用手写计数循环。 避免使用枚举?枚举变量非常方便,但是它会牺牲执行的速度和并大幅增加文件体积。例如:? ?public class Foo {?public enum Shrubbery { GROUND, CRAWLING, HANGING }?}?会产生一个900字节的.class文件(Foo$Shubbery.class)。在它被首次调用时,这个类会调用初始化方法来准备每个枚举变量。每个枚举项都会被声明成一个静态变量,并被赋值。然后将这些静态变量放在一个名为”$VALUES”的静态数组变量中。而这么一大堆代码,仅仅是为了使用三个整数。备注:尽量少用枚举类型,减少内存消耗和运行速度。 避免使用浮点数嵌入式处理器通常没有支持浮点运算的硬件,所有对”float”和”double”的运算都是通过软件实现的。通常的经验是,在Android设备中,浮点数会比整型慢两倍。 避免深度继承子类构建会导致父类的递归构建。 慎用异常异常对性能不利。抛出异常首先要创建一个新的对象。Throwable接口的构造函数调用名为fi

文档评论(0)

wuyuetian + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档