毫无疑问,基于Android平台的设备一定是嵌入式设备。现代手持设备不仅仅是电话;它是一台小型掌上电脑,但即使是最快的高端掌上电脑也远不及中等台式机。这就是为什么在编写Android程序时,您应该始终考虑执行效率。这些系统并没有你想象的那么快,你还需要考虑它的电池寿命。这意味着没有太多空间可供您浪费。因此,大家在编写Android程序的时候,应该尽可能优化自己的代码,以提高效率。本页介绍几种使开发者的Android程序运行更高效的方法。通过下面的跳转链接,你可以学习到如何让你的程序运行得更有效率。简介如何判断一个系统的不合理有两个基本原则:不做不必要的事情。尽可能节省内存使用量。以下所有方法都基于这两项。人们会认为该页面在如何进行“过早优化”上花费了大量篇幅。虽然微优化有时难以开发高效的数据结构和算法,但在嵌入式手持设备方面您别无选择。比如你把你台式机的虚拟机移植到你的安卓系统上,你会发现你写的程序会占用你的内存。这会导致程序运行极其缓慢,甚至不考虑它对系统上运行的其他程序的影响。这就是上述两个原则如此重要的原因。Android的成功在于开发程序为用户提供的体验。但是,用户体验的好坏,取决于你的代码能否及时响应,不会拖慢速度,让人崩溃。因为我们所有的程序都将在同一台设备上运行,所以我们将它们视为一个整体。这篇文章就像考驾照需要学习的交通规则:人人遵守,万事大吉;但是当你不服从时,你就会崩溃。在我们进入正题之前,快速说明一下:无论虚拟机是否是Java编译器的一个特性,下面提出的所有要点都是正确的。如果我们有两个方法来完成同样的事情,但是foo()的解释比bar()快,那么foo()的编译速度一定不会比bar()慢,只是靠编译器来让你的代码运行速度提升是不明智的。尽可能避免对象创建(Object)对象创建不是没有代价的。具有线程分配池的分代内存管理机制将降低创建临时对象的成本。不分配内存总比不分配内存好。如果您在UI循环中分配对象,则必须强制释放,这可能会导致用户体验出现轻微问题。因此,除非必要,否则不应创建对象实例。下面是一个有用的示例:从原始输入数据中提取字符串时,尝试从原始字符串中返回一个子字符串,而不是创建一个副本。您将创建一个新的String对象,但它将与您的原始数据共享数据空间。如果你有一个返回String的方法,你应该知道无论如何返回的结果都是一个StringBuffer,并且改变你的函数的定义和实现,让函数直接返回而不是通过创建一个临时对象。比较激进的方法是将一个多维数组拆分成几个平行的一维数组:一个Int类型的数组比一个Integer类型的数组要好,但是也可以总结成这样一个原则,两个Int类型的数组数组多比(int,int)对象数组更有效。同样的原则适用于其他原始数据类型。如果您需要创建一个包含一系列Foo和Bar对象的容器(container),请记住:两个并行的Foo[]和Bar[]比一个(Foo,Bar)对象数组要高效得多。(这个例子也有一个例外,当你设计接口API到其他代码时;在这种情况下,速度上的小损失不是问题。但是,在你的代码内部,你应该编写尽可能高效的代码。)一般来说,尽可能避免创建寿命短的临时对象。更少的对象创建意味着更少的垃圾收集,从而提高应用程序的用户体验质量。使用本机方法(UseNativeMethods)在处理字符串时,不要犹豫,尽可能多地使用对象本身具有的方法,例如String.indexOf()、String.lastIndexOf()。因为这些方法是使用C/C++实现的,所以比在java循环中做同样的事情快10-100倍。另外要补充的是,使用这些自己的方法的成本比解释的要高得多。因此,对于细微的操作,尽量不要使用此类方法。使用virtual优于使用interface假设你有一个HashMap对象,你可以将它声明为一个HashMap或只是一个Map:Java代码MapmyMap1=newHashMap();HashMapmyMap2=newHashMap();哪一个更好?一般来说,使用Map是明智的,因为它允许您更改Map接口来执行上述任何操作,但这种“明智”的做法仅适用于常规编程,不适用于嵌入式系统。通过接口引用调用的时间是通过具体引用调用虚函数的2倍以上。如果你因为更适合你的编程而选择使用HashMap,那么使用Map就毫无价值了。假设您有一个可以重构您的代码的IDE,调用Map是没有用的,即使您不确定您的程序从哪里开始。(同样,publicAPI是个例外,一个好的API的价值往往大于执行效率的损失)使用static比使用virtual要好如果你不必访问对象的外部,那么让你的方法静态方法。它将被更快地调用,因为它不需要虚函数引用列表。这也是一个很好的做法,因为它告诉你如何区分方法的签名,调用这个方法不会改变对象的状态。尽量避免像C++iyangde编程语言那样使用固有的Get和Set方法,通常使用Get方法(例如i=getCount())来代替直接访问该属性(i=mCount)。这是C++编程中的一个好习惯,因为编译器会将访问方式设置为Inline,如果要约束或调试属性访问,只需要随时添加一些代码即可。在Android编程中,这不是一个非常糟糕的主意。虚方法的调用会产生很大的开销,比实例属性查询的开销还要大。外部调用时我们应该使用Get和Set函数,但是内部调用时,我们应该直接调用它们。缓存属性调用缓存字段查找来访问对象属性比访问局部变量慢得多。您不应该这样编写代码:Java代码for(inti=0;i
