Android应用程序运行的性能设计

  次阅读 作者:智能小宝 来源:互联网 2016-01-19 12:21 我要评论(0)

Android应用程序运行的移动设备受限于其运算能力,存储空间,及电池续航。由此,它必须是高效的。电池续航可能是一个促使你优化程序的原因, 即使他看起来已经运行的足够快了。由于续航对用户的重要性,当电量耗损陡增时,意味这用户迟早会发现是由于你的程序。

虽然这份文档主要包含着细微的优化,但这些绝不能成为你软件成败的关键。选择合适的算法和数据结构永远是你最先应该考虑的事情,但这超出这份文 档之外。

1. 介绍

写出高效的代码有两条基本的原则:

◆ 不作没有必要的工作

◆ 尽量避免内存分配。

2. 明智的优化

这份文档是关于Android规范的细微优化,所以先确保你已经了解哪些代码需要优化,并且知道如何去衡量你所做修改所带来的效果(好或坏)。 用开投资开发的时间是有限的,所以明智的时间规划很重要。

这份文档同时确保你在算法和数据结构上作出最佳选择,同时考虑了API选择所带来的潜在影响。使用恰当的数据结构和算法比这里的任何建议都有价 值,考虑API版本带来的影响会如实你选择更好的实现。

当你优化Android程序时会遇到的一个棘手问题是确保你的程序能在不同的硬件平台上运行。不同版本的虚拟机在不同处理器上的运行速度各不相 同。并且不是简单的设备A比设备B快或者慢,并针对一个设备与其他设备之间做出排列。特别的,模拟器上只能评测小部分可以在设备上体现的东西。有无JIT 的设备间也有着巨大差异:对于有JIT设备好的代码有时对无JIT的设备并不是最好的。

如果你想知道程序在设备上的表现,就必须在上面进行测试

3. 避免创建不必要的对象

对象创建永远不会免费的。每个线程的分代GC给临时对象分配一个地址池能降低分配开销,但分配内存往往需要比不分配内存高的代价。

如果在用户界面周期内分配对象,会强制一个周期性的垃圾回收,给用户体验造成小小的停顿间隙。Gingerbread中介绍的并发回收也许有 用,但应该避免不必要的工作。

因此,避免创建不需要的对象实例。下面是几个例子:

◆ 如果有一个返回String的方法,他的返回值通常附加在一个StringBuffer上,改变声明和实现,这样函数直接在其后面附加,而非创建一个短暂 存在的临时变量。

◆ 当从输入的数据集合中读取数据时,考虑返回原始数据的子串,而非新建一个拷贝。这样你会创建一个新的对象,但是他们共享该数据的char数组。换来的是即 使你仅仅使用原始输入的一部分,你也需要保证它一直存在于内存中。

一个更彻底的观点是将多维数组切割成一维数组:

◆ Int类型的数组比Integer类型的好。推而广之,两个平行的int数组要比一个(int,int)型的对象数组高效。这个定理对于任何基本数据类型 的组合都通用。

◆ 如果需要实现存放元组(Foo,Bar)对象的容器,记住两个平行数组Foo[], Bar[]会优于一个(Foo,Bar)对象的数组。(例外情况是:当你设计API给其他代码调用时,最好用好的API设计来换取小的速度提升。但在自己 的内部代码中,尽量尝试高效的实现。)

通常来说,尽量避免创建短时临时对象。少的对象创建意味着低频的垃圾回收。这对于用户体验产生直接的影响。

4. 性能之谜

前一个版本的文档给出了好多误导人的主张,这里做一些澄清:

◆ 在没有JIT的设备上,调用方法所传递的对象采用具体的类型而非接口类型会更有效(比如,传递HashMap map比传递Map map调用一个方法耗费的开销小,尽管两种情况下的map都是HashMap)。但这并不是两倍慢的情形,事实上,只相差6%,而JIT使这两种调用的效 率不分伯仲。

◆ 在没有JIT的设备上,访问缓存后的字段比直接访问字段快大概20%。在有JIT的情况下,字段访问和局部访问耗费是一样的 。所以这里不值得优化,除非你觉得他会让你的代码更易读(对于final,static,及static final 变量同样适用).

5. 用静态代替虚拟

如果不需要访问某对象的字段,将方法设置为静态,调用会加速15%到20%。这也是一种好的做法,因为你可以通过方法声明知晓调用该方法不需要 更新此对象的状态。

6. 避免内部的Getters/Setters

在源生语言像C++中,通常做法是用Getters(i=getCount())代替直接访问字段(i=mCount)。这是C++中一个好的 习惯,因为编译器会内联这些访问,如果需要约束或者调试这些域的访问,你可以在任何时间添加代码

Android中,这是个不好的想法。虚方法调用代价比直接存取字段高昂的多。按照通常面向对象语言的做法在公共接口中使用Getters和 Setters是有原因的,但应该在一个经常访问其字段的类中采用直接访问。

本站文章信息来源于网络以及网友投稿,本站只负责对文章进行整理、排版、编辑,是出于传递更多信息之目的,并不意味着赞同其观点或证实其内容的真实性。如果您有什么意见或建议,请联系QQ28-1688-302!

人工智能实验室
相关文章相关文章
  • 未来两年人工智能要怎么走?看这篇就够了

    未来两年人工智能要怎么走?看这篇就够了

  • 英国研发“杀生”机器人 通过生命体获取能量

    英国研发“杀生”机器人 通过生命体获取能量

  • 无人驾驶汽车如何改变城市生活?听听他们怎么说

    无人驾驶汽车如何改变城市生活?听听他们怎么说

  • 韩春雨称已能重复实验结果 近期将有消息公布

    韩春雨称已能重复实验结果 近期将有消息公布

网友点评网友点评
阅读推荐阅读推荐

据国外媒体报道,在过去两年内,聊天机器人(chatbot)、人工智能以及机器学习的研发和采用取得了巨大进展。许多初创公司正利用人工智能和...

霍金 视觉中国 图 英国著名物理学家霍金(Stephen Hawking)再次就人工智能(AI)发声,他认为:对于人类来说,强大AI的出现可能是最美妙的...

文|郑娟娟 今年,人工智能(AI) 60岁了。在AI60岁的时候,笔者想要介绍一下AI100,一个刚刚2岁的研究项目,但它的预设寿命是100年,甚至更长...

AlphaGo与李世石的人机大战,为大众迅速普及了人工智能的概念。 但对谷歌而言,除了下围棋,现在的人工智能进展到哪一步了?未来,人工智能...