Android应用性能优化的小技巧

本篇文档主要涵盖了一些能够提升App整体性能的小的优化技巧,但对应用的性能不会造成大幅度的改进。大的提升和改进首要的还是选择正确的算法和数据结构,但这两条并不在本篇文档的描述范围内。在平时的编码过程中,你就应当运用文档中提到的技巧,这样才能养成编写高效的代码的良好习惯。

编写高效的代码时,有两条基本准则:

  • 不做没必要的事。
  • 不分配没必要的内存。

当你打算优化你的Android应用的时候,最[精妙]的是你的应用将会运行在多种不同的硬件设备上。不同版本的虚拟机运行在不同的进程,会有不同的速度。事实并不会像你所说的“设备X比设备Y跑起来要快/慢”那么简单,你也不能将同一个结果推广到其它的设备。Emulator无法告知你应用在真实的设备上运行的性能。是否使用JIT也会使得设备之间有极大的不同:在一个使用JIT的设备上运行完美的代码,在另一袋没有JIT的设备上运行,结果通常并不那么乐观。
本Markdown编辑器使用[StackEdit][6]修改而来,用它写博客,将会带来全新的体验哦:

避免创建不必要的对象


创建对象从来都不是无代价的。尽管垃圾回收机制使得对每个线程的临时对象分配内存变得更加廉价,但是分配内存永远比不分配代价更大。

当你在应用中为了创建对象而分配了很多内存,会触发周期性的垃圾回收,用户体验会有一些卡顿。同时执行的垃圾回收器在Android2.3的help文档中有介绍,但是不必要的工作还是要尽量避免。

因此,你应当尽量避免创建不必要的对象实例。例如:

  • 如果你有一个返回类型String的方法,并且它返回的结果会被附加在StringBuffer类型后,改变你的继承和签名方式,使该函数直接被附加,而不是创建一个临时的对象。
  • 当从一串输入的数据中获取String类型数据时,最好返回原始数据的substring,而不是建立一个copy。你会建立一个新的String对象,但是它会和原始数据共享其char[]。(其权衡之处就在于如果你只是使用原始数据的很小一部分,你将会在内存中一直保留这个数据,无论是否选择使用这个方法)。

一个更激进的方法就是将多维数组切割成多个并列的一维数组:

  • 一个int型的数组s要比一个Integer类型的数组对象好很多,这也可以推广到另一个问题,两个并列的int数组要比一个(int, int)型的对象更有效率。这个原则适用于任何基本数据类型的组合。
  • 如果你需要继承一个容器,包含了元组(Foo, Bar)对象,最好记得使用两个并列的数组Foo[]和Bar[]将会更好。(这种情况的特例就是,当你在设计一个供其它代码调用的API时,最好通过对速度上的妥协换来一个良好的API设计。但是在你自己的代码中,最好还是怎么高效怎么来。)

总的来说,避免创建不必要的对象。较少的对象创建意味着调用垃圾回收的频率降低,这会对用户体验带来最直观的改善。

最好使用static而不是virtual


如果你不需要在方法中调用任何对象,将方法写成static。远程调用(invocation)将会提高15%-20%。这也是一个优良的做法,因为你可以通过方法标签来判别调用的方法是否会改变对象的状态。

常量最好使用static final


考虑在类的开始进行如下声明:

编译器会生成一个类的初始化方法,,在类第一次使用时执行。该方法将值“42”储存在变量intVal中,并且在类文件的string常量表中为变量strVal获得一个引用。这些变量之后的引用,将会通过查询表来获取。

我们可以通过使用final关键字来提升性能:

类将不再需要初始化的方法,因为常量将会在dex文件的静态区初始化。调用变量intVal的相关代码,将会直接调用值“42”,调用变量strVal的代码将会使用相对“廉价”的string常量指令而不是表查询。

注意:这种优化方式仅适用于基本数据类型和String常量,而不是随便什么类型。不过无论是否有必要,声明一个static final的常量总是更好一些。

避免内部Getters/Setters


在native语言例如C++中,通常都会使用getters(i = getCount())而不是直接调用(i = mCount)。这是使用C++时一个良好的习惯,也经常被用在其它面向对象语言中,例如C#和Java。因为编译器通常可以内联访问(这些对象或变量),如果你需要限制调用或者debug,就可以在任意位置加上相关的代码。

不使用JIT,直接调用的速度是3倍于通过getter调用的。使用JIT,直接调用则会7倍于通过getter调用。

注意: 如果你使用ProGuard,你将获得两种不同方式的最好体验,因为ProGuard可以为你提供内联访问。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值