Android应用开发者指南性能优化

Android应用开发者指南性能优化

ID:41005724

大小:103.09 KB

页数:7页

时间:2019-08-13

Android应用开发者指南性能优化_第1页
Android应用开发者指南性能优化_第2页
Android应用开发者指南性能优化_第3页
Android应用开发者指南性能优化_第4页
Android应用开发者指南性能优化_第5页
资源描述:

《Android应用开发者指南性能优化》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、Android应用开发者指南:性能优化本文为致力于Android官方应用文档汉化的网友们发布的最新一章《Android应用开发者指南》,原文为(DevGuide)/BestPractices/DesigningForPerformanc,这里译为“性能优化”,版本为Android3.1r1。性能优化Android应用程序运行的移动设备受限于其运算能力,存储空间,及电池续航。由此,它必须是高效的。电池续航可能是一个促使你优化程序的原因,即使他看起来已经运行的足够快了。由于续航对用户的重要性,当电量耗

2、损陡增时,意味这用户迟早会发现是由于你的程序。虽然这份文档主要包含着细微的优化,但这些绝不能成为你软件成败的关键。选择合适的算法和数据结构永远是你最先应该考虑的事情,但这超出这份文档之外。简介写出高效的代码有两条基本的原则:◆不作没有必要的工作。◆尽量避免内存分配。明智的优化这份文档是关于Android规范的细微优化,所以先确保你已经了解哪些代码需要优化,并且知道如何去衡量你所做修改所带来的效果(好或坏)。开发投入的时间是有限的,所以明智的时间规划很重要。这份文档同时确保你在算法和数据结构上作出最

3、佳选择的同时,考虑API选择所带来的潜在影响。使用合适的数据结构和算法比这里的任何建议都更有价值,优先考虑API版本带来的影响有助于你找到更好的实现。(这在类库代码中更为重要,相比应用代码)在优化Android程序时,会遇到的一个棘手问题是,保证你的程序能在不同的硬件平台上运行。虚拟机版本和处理器各部相同,因此运行在之上的速度也大不一样。但这并且不是简单的A比B快或慢,并能在设备间做出排列。特别的,模拟器上只能评测出一小部分设备上体现的东西。有无JIT的设备间也存在着巨大差异,在JIT设备上好的代

4、码有时候会在无JIT的设备上表现的并不好。如果你想知道一个程序在设备上的具体表现,就必须在上面进行测试。避免创建不必要的对象对象创建永远不会是免费的。每个线程的分代GC给零时对象分配一个地址池以降低分配开销,但往往内存分配比不分配需要的代价大。如果在用户界面周期内分配对象,就会强制一个周期性的垃圾回收,给用户体验增加小小的停顿间隙。Gingerbread中提到的并发回收也许有用,但不必要的工作应当被避免的。因此,应该避免不必要的对象创建。下面是几个例子:◆如果有一个返回String的方法,并且他的

5、返回值常常附加在一个StringBuffer上,改变声明和实现,让函数直接在其后面附加,而非创建一个短暂存在的零时变量。◆当从输入的数据集合中读取数据时,考虑返回原始数据的子串,而非新建一个拷贝.这样你虽然创建一个新的对象,但是他们共享该数据的char数组。(结果是即使仅仅使用原始输入的一部分,你也需要保证它的整体一直存在于内存中。)一个更彻底的方案是将多维数组切割成平行一维数组:◆Int类型的数组常有余Integer类型的。推而广之,两个平行的int数组要比一个(int,int)型的对象数组高效

6、。这对于其他任何基本数据类型的组合都通用。◆如果需要实现一个容器来存放元组(Foo,Bar),两个平行数组Foo[],Bar[]会优于一个(Foo,Bar)对象的数组。(例外情况是:当你设计API给其他代码调用时,应用好的API设计来换取小的速度提升。但在自己的内部代码中,尽量尝试高效的实现。)通常来讲,尽量避免创建短时零时对象.少的对象创建意味着低频的垃圾回收。而这对于用户体验产生直接的影响。性能之谜前一个版本的文档给出了好多误导人的主张,这里做一些澄清:在没有JIT的设备上,调用方法所传递的对

7、象采用具体的类型而非接口类型会更高效(比如,传递HashMapmap比Mapmap调用一个方法的开销小,尽管两个map都是HashMap).但这并不是两倍慢的情形,事实上,他们只相差6%,而有JIT时这两种调用的效率不相上下。在没有JIT的设备上,缓存后的字段访问比直接访问快大概20%。而在有JIT的情况下,字段访问的代价等同于局部访问,因此这里不值得优化,除非你觉得他会让你的代码更易读(对于final,static,及staticfinal变量同样适用)用静态代替虚拟如果不需要访问某对象的字段,

8、将方法设置为静态,调用会加速15%到20%。这也是一种好的做法,因为你可以从方法声明中看出调用该方法不需要更新此对象的状态。避免内部的Getters/Setters在源生语言像C++中,通常做法是用Getters(i=getCount())代替直接字段访问(i=mCount)。这是C++中一个好的习惯,因为编译器会内联这些访问,并且如果需要约束或者调试这些域的访问,你可以在任何时间添加代码。而在Android中,这不是一个好的做法。虚方法调用的代价比直接字段访问高昂许多。通常根据面

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。