Android代码优化.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Android代码优化【转】 2010-08-20 23:40 为性能设计: 1)避免创建对象 对象的创建从来不是免费的。虽然GC使得内存申请代价不再高昂,但是申请总是比不申请来得昂贵。如果你在一个用户接口循环中申请对象,你将会强行执行周期性的GC,在用户体验上出现一些小的“打嗝”,因此除非不得已,你应该避免创建对象实例,下面是一些例子可以帮助理解: 当你在一组输入数据中抽取字符串时,尝试返回源数据的子串,而非创建一个副本。你将会创建一个新的String对象,但是它会和数据共享字符数组char[]。 如果你有一个返回String的方法,而且你知道它的结果将会一直被追加到StringBuffer,改变你的签名和实现,使这个函数里面直接追加,避免创建临时对象。 一个更激进的主意是将多维数组切成与之平行的一维数组: 一个int数组比Integer数组要好,但也有一个公认的事实就是两个平行的int数组要比一个(int,int)对象数组要高效很多。对于其它原始数据类型亦如是。 如果你需要实现一个存储一组对象(Foo,Bar)的容器,请记住两个平等的Foo[]和Bar[]数组通常元比一个定制对象数组要好(当然,对于此有个例外,就是当你设计一个API供其它代码访问时;在那样的情况下,通常最好是为保证API的正确性而牺牲一点速度。但是在你的内部代码,你应该尽可能保持高效)。 通常来说,避免创建临时对象,如果你可以的话。更少的对象创建意味着更小频率的GC,这对用户体验有直接的影响。 2)用Native方法 当处理字符串时,要毫不犹豫地使用诸如String.indexOf()、String.lastIndexOf()之类的专门方法,这些是典型的用C/C++代码实现的方法,它们可以轻易地比实现同样功能的Java循环快10-100倍。 对此建议的一反面是调用一个native方法要比调用一个解析的方法,不要将native方法用于琐碎的计算,如果可以避免的话。 优先使用Virtual而非Interface 假如你有一个HashMap对象,你可以声明它为一个HashMap或一个通用的Map: Map myMap1 = new HashMap(); HashMap myMap2 = new HashMap(); 哪一个更好? 一般的会说你该选择Map,因为它允许你改变其实现,对于通常的编程来说这是对的,但是对于嵌入式系统来说这并不是太妙。通过接口的引用来调用一个方法要比通过一个具体类型的引用调用virtual方法花多2倍的时间。 如果你已经选择了一个HashMap,因为它正好适用你正在做的事情,那通过Map来调用就没有什么价值了。考虑到IDE可以为你重构代码,用Map来调用就没有太大价值了,即使你不知道你代码将去向何方(但是,再一次的,公共的API是又是一个例外:好的API较少考虑性能)。 3)优先选择static而非virtual 如果你不必访问一个对象的字段,使你的方法成为static方法。它可以被更快地调用,因为它不需要一个虚拟方法表间接调用。同时它也是一个好的做法,因为从方法的签名可以看出调用这个方法不会改变对象的状态。 4)避免内部的Getter/Setter 在一些像C++的语言中,通常的做法是用getter(如:i=getCount())代替直接地访问字段(i=mCount),在C++这是一个很好的习惯,因为编译器通常能够内联这个访问,并且你需要限制或debug字段访问,你可以在任何时候增加代码。 在Android,这是一个坏主意。虚拟方法调用代价是昂贵的,实例字段查找代价更高。沿用面一般向对象编程实践在公开接口中提供gettter和setter是合理的,但在一个类中你应该直接访问字段。 Cache字段查找 访问对象字段要比访问本地变量慢得多,如下面这段: for (int i = 0; i this.mCount; i++) dumpItem(this.mItems[i]); 应该写成这样: int count = this.mCount; Item[] items = this.mItems; for (int i = 0; i count; i++) dumpItems(items[i]); (我们用一个显式的”this”来表明这是一个成员变量。) 有一个相似的指引就是,不要在for语句中的第二个从句中调用方法。例如下面这段代码将会在每次迭代中都会执行一次getCount(),这是一个巨大的浪费,你可以将它的值cache为一个int。 for (int i = 0; i this.getCount(); i++) dumpItems(this.getItem(i)); 通常,如果你将要访问一个实例字段多次,一个好的习惯

文档评论(0)

hhuiws1482 + 关注
实名认证
文档贡献者

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

版权声明书
用户编号:5024214302000003

1亿VIP精品文档

相关文档