Google近期在Udacity上发布了Android性能优化的在线课程,分别从渲染,运算与内存,电量几个方面介绍了如何去优化性能,这些课程是Google以前在Youtube上发布的Android性能优化典范专题课程的细化与补充。android
下面是运算篇章的学习笔记,部份内容与前面的性能优化典范有重合,欢迎你们一块儿学习交流!算法
Android中的Java代码会须要通过编译优化再执行的过程。代码的不一样写法会影响到Java编译器的优化效率。例如for循环的不一样写法就会对编译器优化这段代码产生不一样的效率,当程序中包含大量这种可优化的代码的时候,运算性能就会出现问题。想要知道如何优化代码的运算性能就须要知道代码在硬件层的执行差别。性能优化
若是你写了一段代码,它的执行效率比想象中的要差不少。咱们须要知道有哪些因素有可能影响到这段代码的执行效率。例如:比较两个float数值大小的执行时间是int数值的4倍左右。这是由于CPU的运算架构致使的,以下图所示:架构
虽然现代的CPU架构获得了很大的提高,也许并不存在上面所示的那么大的差别,可是这个例子说明了代码写法上的差别会对运算性能产生很大的影响。app
一般来讲有两类运行效率差的状况:第1种是相对执行时间长的方法,咱们能够很轻松的找到这些方法并作必定的优化。第2种是执行时间短,可是执行频次很高的方法,由于执行次数多,累积效应下就会对性能产生很大的影响。工具
修复这些细节效率问题,须要使用Android SDK提供的工具,进行仔细的测量,而后再进行微调修复。性能
经过Android Studio打开里面的Android Device Monitor,切换到DDMS窗口,点击左边栏上面想要跟踪的进程,再点击上面的Start Method Tracing的按钮,以下图所示:学习
启动跟踪以后,再操控app,作一些你想要跟踪的事件,例如滑动listview,点击某些视图进入另一个页面等等。操做完以后,回到Android Device Monitor,再次点击Method Tracing的按钮中止跟踪。此时工具会为刚才的操做生成TraceView的详细视图。优化
关于TraceView中详细数据如何查看,这里不展开了,有不少文章介绍过。spa
为了提高运算性能,这里介绍2个很是重要的技术,Batching与Caching。
Batching是在真正执行运算操做以前对数据进行批量预处理,例如你须要有这样一个方法,它的做用是查找某个值是否存在与于一堆数据中。假设一个前提,咱们会先对数据作排序,而后使用二分查找法来判断值是否存在。咱们先看第一种状况,下图中存在着屡次重复的排序操做。
在上面的那种写法下,若是数据的量级并不大的话,应该还能够接受,但是若是数据集很是大,就会有严重的效率问题。那么咱们看下改进的写法,把排序的操做打包绑定只执行一次:
上面就是Batching的一种示例:把重复的操做拎出来,打包只执行一次。
Caching的理念很容易理解,在不少方面都有体现,下面举一个for循环的例子:
上面这2种基础技巧很是实用,积极恰当的使用可以显著提高运算性能。
提高代码的运算效率是改善性能的一方面,让代码执行在哪一个线程也一样很重要。咱们都知道Android的Main Thread也是UI Thread,它须要承担用户的触摸事件的反馈,界面视图的渲染等操做。这就意味着,咱们不能在Main Thread里面作任何非轻量级的操做,相似I/O操做会花费大量时间,这颇有可能会致使界面渲染发生丢帧的现象,甚至有可能致使ANR。防止这些问题的解决办法就是把那些可能有性能问题的代码移到非UI线程进行操做。
另一个咱们须要注意的运算性能问题是基础算法的合理选择,例如冒泡排序与快速排序的性能差别:
避免咱们重复造轮子,Java提供了不少现成的容器,例如Vector,ArrayList,LinkedList,HashMap等等,在Android里面还有新增长的SparseArray等,咱们须要了解这些基础容器的性能差别以及适用场景。这样才可以选择合适的容器,达到最佳的性能。