对于移动开发者性能设计应用指南

来源:java认证发布时间:2012-11-12 12:47:59java认证视频

一个应用程序将运行在移动设备有限的计算电源和存储,并限制电池寿命。因为这,应该是有效的。电池寿命是一个原因,你可能要优化你的应用程序,即使它似乎已经运行“快”。电池寿命是重要的用户,和机器人的电池的使用故障是指用户将知道如果您的应用程序负责消耗电池。
注意,虽然这个文件主要包括micro-optimizations,这些几乎不会使或打破你的软件。选择正确的数据结构与算法应该永远是你的优先权,但本文档的范围之外。

基本的规

         有两点基本的规则编写高效的代码:
• 不要做工作,你不需要做的。
• 不分配内存,如果你能避免它。
优化明智
本文件是关于micro-optimization机器人专用的,所以它假定你已经使用貌相解决什么代码需要被优化,而且你已经有了一个方法来衡量效果(好或坏)对你所做的任何更改。你只有这么多时间投资工程,所以重要的是要知道你要明智地花钱。

该文件还假定您作出最佳决策数据结构和算法,而你也考虑未来性能后果你的决定。使用正确的数据结构和算法将使更多的差异比任何的忠告在这里,并考虑对绩效的影响你的决定使它更容易切换到更好的实现以后(这是更重要的库代码比应用程序代码)。

棘手的一个问题是当你面对micro-optimizing机器人应用程序是,你的程序是相当多的保证是运行于多硬件平台。不同版本的虚拟机上运行的不同处理器运行在不同的速度。这不是一般的情况你可以简单地说“装置是一种因子快/慢于设备”,和规模的结果从一个设备到别人。特别是,测量在模拟器上告诉你甚少性能上的任何设备。在那里也有巨大的设备之间的差异和没有准时:“最好的”代码的设备与这并不总是最好的代码的装置没有。
如果你想知道如何在你的应用程序执行一个给定的设备,你需要试验设备。

避免创建不必要的对象

对象的创建是永远免费。一代与每个线程分配色谱池临时对象可以分配更便宜,但分配内存永远是更昂贵的比不分配内存。
如果你分配对象的用户界面,你会定期垃圾收集,创造一些“打嗝”的用户体验。本并行收藏家介绍姜饼帮助,但不必要的工作应始终避免。
因此,你应该避免创建对象实例,你不需要。一些事情的例子,可以帮助:
• 如果你有一个方法返回一个字符串,你知道结果总是会被添加到一个stringbuffer无论如何,改变你的签名实施这样的功能附加直接,而不是创建一个短暂的临时对象。
• 当提取字符串从输入数据集,尝试返回一个字符串的原始数据,而不是创建一个副本。您将创建一个新的字符串对象,但它将分享字符[ ]与数据。(权衡是如果你只使用一小部分原始输入,你会保持它所有在内存中无论如何,如果你走这条路。)

有些更激进的想法是把多维数组一维阵列平行单:

• 一个整型数组是一个比一个整数数组,但这也推广了这一事实,两根平行排列的整数也有一个很多更有效地比数组(智力,智力)对象的。同样,任何组合的原始类型。
• 如果你需要实现一个容器存储元组(富,酒吧)对象,请记住,两根平行富[ ]和[ ]数组一般明显优于单一阵列的自定义对象(富,酒吧)。(这个例外,当然,是当你在设计一个应用程序接口其他代码访问;在这种情况下,它通常是更好的交易好的接口设计小打速度。但在你自己的内部代码,你应该尝试和尽可能高效。)
一般来说,避免造成短期的临时对象,如果你可以。更少的对象创建的意思不太频繁的垃圾收集,其中有一个直接的用户体验的影响。

性能神话

以前版本的这份文件作出了各种各样的误导。我们地址,其中一些在这里。
设备不准时,这是真的,通过调用方法可变的确切类型而不是一个界面稍微有效的。(因此,例如,它是便宜调用方法上然后利用地图比地图地图,即使在例图被值。)这不是这种情况是2倍慢;实际差异更像是慢6%。此外,准时将两者有效区分。
设备不准时,实地访问缓存是约20%速度比多次accesssing场。一个准时,实地访问相同的成本作为本地接入,所以这不是一个值得优化除非你感觉到它使代码更易于阅读。(这是真正的最后,静,静最后的战场了。)

喜欢静态虚拟

如果你不需要访问一个对象的领域,使你静。调用将大约15% - 20%的速度。这也是很好的做法,因为你可以告诉从方法签名,调用的方法不能改变对象的状态。
避免内部getter / setter
在本地语言如+这是常见的做法是使用消气剂(例如我= getcount())而不是访问直接(我= mcount)。这是一个很好的习惯,+,因为编译器通常在线访问,如果你需要限制或调试现场访问您可以添

加代码在任何时间。

机器人,这是一个坏主意。虚方法调用是昂贵的,多比实例字段查找。这是合理的后续常见的面向对象的编程习惯和吸气和二传手在公共接口,但在一个班你应该访问域直接。
不准时,直接接入领域是3倍速度比调用琐碎的吸气剂。与准时生产(其中直接接入领域是便宜访问一个地方),直接接入领域约7倍的速度比调用琐碎的吸气剂。这是真正的Fro yo,但将提高在未来时准时内联吸气剂的方法。

最后使用静态常量

考虑以下的声明放在一个类:
静态变量intval = 42;静态字符串strval =“你好,世界!”;
编译器生成的类的初始化方法,称为< cpnit >,是执行,当类是第一次使用。该方法存储值42成intval,并提取参考的类文件的字符串常数表strval。当这些值是参照稍后,他们访问的领域查找。
我们可以改善事项与“最后”的关键字:
静态最终国际intval = 42;静态最终字符串strval =“你好,世界!”;
类不再需要< cpnit >方法,因为常数进入静电场在地塞米松初始化文件。代码,是指intval将使用整数42直接访问,和strval将使用一个相对便宜的“字符串常数”指令而不是现场查找。(注意这仅适用于原始类型和优化字符串常数,不任意参考类型。不过,这是很好的实践声明常量静态最终只要有可能。)

使用增强的语法

加强环(有时也被称为“- each循环)可以用来对集合执行迭代的界面和阵列。随着收藏品,迭代器是分配使调用接口到hasnext()和next()。与vector,手写计数回路约3倍的速度(或生产),但其他收藏品的增强循环语法将完全等同于明确的迭代器的用法。

有几个办法遍历数组:

静态类型{国际msplat;}富[ ]慕雷=…公共无效zero() {国际和= 0;为(国际我= 0;我< marray.length;+ +我){和+ =慕雷[我]。msplat;}}公共无效one() {国际和= 0;富[ ] localarray =乳腺;localarray.length数组=;为(国际我= 0;我<伦;+ +我){和+ = localarray [我]。msplat;}}公共无效two() {国际和= 0;为(富:乳腺){a.msplat总和+ =;}}
zero()是慢的,因为它可以没有优化掉成本得到数组的长度为每一次迭代中通过环。
one()快。它把一切地方变量,避免查找。只有数组的长度提供了一个性能效益。
two()是最快的设备不准时,和区分one()设备与生产。它使用增强的语法1.5版中介绍的编程语言。
总结:使用增强循环的默认,但考虑手写计算循环迭代关键Array。

考虑包而不是私人访问私有内部类

考虑下面的类定义:

公共类富{私有内部类{无效stuff() {这dostuff(富富。。。这高宽比m。);}}人的高宽比m;公共无效run() {内inner() =新;高宽比m = 27;在stuff();}私人无效dostuff(返回值){系统提供了。。(“价值”的价值);}}
关键的东西,这里需要注意的是,我们定义一个私有内部类(富$内)直接访问私有方法和私人在外部类的实例字段。这是法律,和代码打印“价值27“预期。
问题是,虚拟机将直接进入富的私有成员富$内是非法的富与富$内不同类别,虽然爪哇语言允许一个内部类访问外部类的私人成员。缩小差距,编译器产生一对合成方法:
/ * * /静态数据包中获得100美元。(富富){返回foo.mvalue;}/ * * /静态无效食品包装。获得200美元(富富,返回值){富。dostuff(价值);}
内部类的代码调用这些方法时,它需要访问高宽比m领域或者调用dostuff方法在外部类。这是什么意思,上面的代码真的归结为如你访问域成员通过访问方法。前面我们谈到了如何存取速度比直接磁场访问,所以这是一个例子,一个特定的语言风格导致“看不见”的性能损失。
如果你使用这样的代码的性能热点,你能避免架空宣布域和方法访问内部类有包访问,而不是私人访问。不幸的是这是战场可以直接访问其他同一包中的类,所以你不应该利用这一公共接口。

使用浮点明智

作为一个经验法则,约2倍低于浮点整数机器人装置。这是真正的一个fpu-less,jit-less与联系的一个一个浮点运算单元和准时。(当然,绝对速度之间的差异2设备是大约10倍的算术运算。)
在速度方面,是没有区别的浮与双在更现代的硬件。空域,双是2倍大。与台式机,假设空间不是一个问题,你宁愿双到浮。
此外,即使是整数,一些芯片硬件乘法但缺乏硬件分。在这种情况下,整数除法、模运算在软件的一些思考,如果你设计的哈希表或做大量的数学。

了解和使用库

除了通常的理由喜欢图书馆在滚动代码你自己,记住,自由更换电话系统图书馆的方法与手工编写的汇编程序,这可能是更好的比最好的代码的能产生相当于爪哇。典型的例子在这里string.indexof和朋友,其中Dal vik替换一个内嵌的内在。同样的,system.arraycopy方法是关于英国的速度比手工环上的一个与准时。

谨慎使用本地方法

本地代码不一定是更有效地比爪哇。一件事,有一个相关的成本与java-native过渡,和它可以不优化跨越这些界限。如果你是本地资源(内存分配在本地堆,文件描述符,或什么的),它可以显更难安排及时收集这些资源。你也需要编译你的代码为每个架构上运行(而不是你希望的依靠它有一个生产)。你甚至可能有多个版本的编译为你所认为的同一建筑:本地代码编译为臂处理器在G不能充分利用手臂的联系,和汇编代码的手臂在一个不能运行于手臂的G。
本地代码主要是有用的当您有一个现有的本地代码库你想港口机器人,不是“加快”部分的一个程序。
如果你需要使用本地代码,你应该阅读我们的应用技巧。

关闭笔记

最后一件事:测量。在您开始优化,确保你有一个问题。确保您可以准确地测量你现有的性能,或你无法衡量的利益,选择你。
每一个索赔在本文件是由一个基准。源这些基准可以发现在code.google.com“模型”项目。
基准的建立与卡尺microbenchmarking架构系统。microbenchmarks难以得到的权利,所以卡尺出去其方法为你做的努力,甚至有些情况下你发现什么你认为你不测量测量(因为,说,虚拟机进行管理优化你的代码了)。我们强烈建议你使用卡尺经营自己的microbenchmarks。
你也可以找到traceview有用的貌相,但重要的是要认识到,它目前不准时,这可以使它misattribute时间代码,这也许可以赢得回来。这是特别重要的修改后的建议,traceview数据以确保由此产生的代码实际上运行速度运行时没有traceview。

 

TAG: 移动开发应用设计

 -5-3-1-+1+3+5

评分:0

视频学习

我考网版权与免责声明

① 凡本网注明稿件来源为"原创"的所有文字、图片和音视频稿件,版权均属本网所有。任何媒体、网站或个人转载、链接转贴或以其他方式复制发表时必须注明"稿件来源:我考网",违者本网将依法追究责任;

② 本网部分稿件来源于网络,任何单位或个人认为我考网发布的内容可能涉嫌侵犯其合法权益,应该及时向我考网书面反馈,并提供身份证明、权属证明及详细侵权情况证明,我考网在收到上述法律文件后,将会尽快移除被控侵权内容。

最近更新

社区交流

考试问答