优就业Android教程-Android应用程序运行的性能设计37358.pdf
《优就业Android教程-Android应用程序运行的性能设计37358.pdf》由会员分享,可在线阅读,更多相关《优就业Android教程-Android应用程序运行的性能设计37358.pdf(11页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、.1 优就业Android 教程-Android应用程序运行的性能设计 Android 应用程序运行的移动设备受限于其运算能力,存储空间,及电池续航。由此,它必须是高效的。电池续航可能是一个促使你优化程序的原因,即使他看起来已经运行的足够快了。由于续航对用户的重要性,当电量耗损陡增时,意味这用户迟早会发现是由于你的程序。虽然这份文档主要包含着细微的优化,但这些绝不能成为你软件成败的关键。选择适宜的算法和数据构造永远是你最先应该考虑的事情,但这超出这份文档之外。1.介绍 写出高效的代码有两条根本的原则:不作没有必要的工作 尽量防止存分配。2.明智的优化 这份文档是关于 Android 规的细微优
2、化,所以先确保你已经了解哪些代码需要优化,并且知道如何去衡量你所做修改所带来的效果(好或坏)。用开投资开发的时间是有限的,所以明智的时间规划很重要。.1 这份文档同时确保你在算法和数据构造上作出最正确选择,同时考虑了 API选择所带来的潜在影响。使用恰当的数据构造和算法比这里的任何建议都有价值,考虑 API 版本带来的影响会如实你选择更好的实现。当你优化 Android 程序时会遇到的一个棘手问题是确保你的程序能在不同的硬件平台上运行。不同版本的虚拟机在不同处理器上的运行速度各不一样。并且不是简单的设备 A 比设备 B 快或者慢,并针对一个设备与其他设备之间做出排列。特别的,模拟器上只能评测小
3、局部可以在设备上表达的东西。有无 JIT的设备间也有着巨大差异:对于有 JIT 设备好的代码有时对无 JIT 的设备并不是最好的。如果你想知道程序在设备上的表现,就必须在上面进展测试 3.防止创立不必要的对象 对象创立永远不会免费的。每个线程的分代 GC 给临时对象分配一个地址池能降低分配开销,但分配存往往需要比不分配存高的代价。如果在用户界面周期分配对象,会强制一个周期性的垃圾回收,给用户体验造成小小的停顿间隙。Gingerbread 中介绍的并发回收也许有用,但应该防止不必要的工作。因此,防止创立不需要的对象实例。下面是几个例子:.1 如果有一个返回 String 的方法,他的返回值通常附
4、加在一个 StringBuffer 上,改变声明和实现,这样函数直接在其后面附加,而非创立一个短暂存在的临时变量。当从输入的数据集合中读取数据时,考虑返回原始数据的子串,而非新建一个拷贝。这样你会创立一个新的对象,但是他们共享该数据的 char 数组。换来的是即使你仅仅使用原始输入的一局部,你也需要保证它一直存在于存中。一个更彻底的观点是将多维数组切割成一维数组:Int 类型的数组比 Integer 类型的好。推而广之,两个平行的 int 数组要比一个(int,int)型的对象数组高效。这个定理对于任何根本数据类型的组合都通用。如果需要实现存放元组(Foo,Bar)对象的容器,记住两个平行数组
5、 Foo,Bar会优于一个(Foo,Bar)对象的数组。(例外情况是:当你设计 API 给其他代码调用时,最好用好的 API 设计来换取小的速度提升。但在自己的部代码中,尽量尝试高效的实现。)通常来说,尽量防止创立短时临时对象。少的对象创立意味着低频的垃圾回收。这对于用户体验产生直接的影响。4.性能之谜.1 前一个版本的文档给出了好多误导人的主,这里做一些澄清:在没有 JIT 的设备上,调用方法所传递的对象采用具体的类型而非接口类型会更有效(比方,传递 HashMap map 比传递 Map map 调用一个方法消耗的开销小,尽管两种情况下的 map 都是 HashMap)。但这并不是两倍慢的
6、情形,事实上,只相差 6%,而 JIT 使这两种调用的效率不分伯仲。在没有 JIT 的设备上,缓存后的字段比直接字段快大概 20%。在有 JIT的情况下,字段和局部消耗是一样的。所以这里不值得优化,除非你觉得他会让你的代码更易读(对于 final,static,及 static final 变量同样适用).5.用静态代替虚拟 如果不需要*对象的字段,将方法设置为静态,调用会加速 15%到 20%。这也是一种好的做法,因为你可以通过方法声明知晓调用该方法不需要更新此对象的状态。6.防止部的 Getters/Setters 在源生语言像C+中,通常做法是用Getters(i=getCount()代
7、替直接字段(i=mCount)。这是 C+中一个好的习惯,因为编译器会联这些,如果需要约束或者调试这些域的,你可以在任何时间添加代码。.1 在 Android 中,这是个不好的想法。虚方法调用代价比直接存取字段高昂的多。按照通常面向对象语言的做法在公共接口中使用 Getters 和 Setters 是有原因的,但应该在一个经常其字段的类中采用直接。无 JIT 时,直接字段大约比调用无关紧要的 getter 来快 3 倍。有 JIT 时(直接字段开销和局部变量是一样的),要快 7 倍。在 Froyo 版本中确实如此,但以后会在 JIT 中改进 Getter 方法的联。7.对常量使用 Static
8、 Final 修饰符 考虑下面类首的声明:Java 代码 static int intVal=42;static String strVal=Hello,world!;编译器生成一个类初始化方法 clinit,当类初次被使用时执行,这个方法将 42 存入 intVal 中,并得到类字符串常量 strVal 的引用。当这些值在后面被引用时,他们通过字段查找进展。我们改进实现,采用 final 关键字:Java 代码.1 static final int intVal=42;static final String strVal=Hello,world!;类不再需要 clinit 方法,因为常量进入
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 就业 Android 教程 应用程序 运行 性能 设计 37358
限制150内