原文链接:http://hukai.me/android-performance-compute/
前言
Android中的Java代码会需要经过编译优化再执行的过程。代码的不同写法会影响到Java编译器的优化效率。例如for循环的不同写法就会对编译器优化这段代码产生不同的效率,当程序中包含大量这种可优化的代码的时候,运算性能就会出现问题。想要知道如何优化代码的运算性能就需要知道代码在硬件层的执行差异。
运算效率
如果你写了一段代码,它的执行效率比想象中的要差很多。我们需要知道有哪些因素有可能影响到这段代码的执行效率。例如:比较两个float数值大小的执行时间是int数值的4倍左右。这是因为CPU的运算架构导致的,如下图所示:

虽然现代的CPU架构得到了很大的提升,也许并不存在上面所示的那么大的差异,但是这个例子说明了代码写法上的差异会对运算性能产生很大的影响。
通常来说有两类运行效率差的情况:第1种是相对执行时间长的方法,我们可以很轻松的找到这些方法并做一定的优化。第2种是执行时间短,但是执行频次很高的方法,因为执行次数多,累积效应下就会对性能产生很大的影响。
修复这些细节效率问题,需要使用Android SDK提供的工具,进行仔细的测量,然后再进行微调修复。
性能跟踪工具
通过Android Studio打开里面的Android Device Monitor,切换到DDMS窗口,点击左边栏上面想要跟踪的进程,再点击上面的Start Method Tracing的按钮,如下图所示:

启动跟踪之后,再操控app,做一些你想要跟踪的事件,例如滑动listview,点击某些视图进入另外一个页面等等。操作完之后,回到Android Device Monitor,再次点击Method Tracing的按钮停止跟踪。此时工具会为刚才的操作生成TraceView的详细视图。关于TraceView中详细数据如何查看,这里不展开了,有很多文章介绍过。

Batching and Caching
为了提升运算性能,这里介绍2个非常重要的技术,Batching与Caching。
Batching是在真正执行运算操作之前对数据进行批量预处理,例如你需要有这样一个方法,它的作用是查找某个值是否存在与于一堆数据中。假设一个前提,我们会先对数据做排序,然后使用二分查找法来判断值是否存在。我们先看第一种情况,下图中存在着多次重复的排序操作。

在上面的那种写法下,如果数据的量级并不大的话,应该还可以接受,可是如果数据集非常大,就会有严重的效率问题。那么我们看下改进的写法,把排序的操作打包绑定只执行一次:

上面就是Batching的一种示例:把重复的操作拎出来,打包只执行一次。
Caching的理念很容易理解,在很多方面都有体现,下面举一个for循环的例子:

上面这2种基础技巧非常实用,积极恰当的使用能够显著提升运算性能。
**重点内容**Blocking the UI Thread
提升代码的运算效率是改善性能的一方面,让代码执行在哪个线程也同样很重要。我们都知道Android的Main Thread也是UI Thread,它需要承担用户的触摸事件的反馈,界面视图的渲染等操作。这就意味着,我们不能在Main Thread里面做任何非轻量级的操作,类似I/O操作会花费大量时间,这很有可能会导致界面渲染发生丢帧的现象,甚至有可能导致ANR。防止这些问题的解决办法就是把那些可能有性能问题的代码移到非UI线程进行操作。
**重点内容**Container Performance
另外一个我们需要注意的运算性能问题是基础算法的合理选择,例如冒泡排序与快速排序的性能差异:

避免我们重复造轮子,Java提供了很多现成的容器,例如Vector,ArrayList,LinkedList,HashMap等等,在Android里面还有新增加的SparseArray等,我们需要了解这些基础容器的性能差异以及适用场景。这样才能够选择合适的容器,达到最佳的性能。

Android性能优化之运算篇(二)相关推荐

  1. Android性能优化之运算篇

    原文转自 Techfox IT技术论坛 运算篇 1) Intro to Compute and Memory Problems Android中的Java代码会需要经过编译优化再执行的过程.代码的不同 ...

  2. Android 性能优化之String篇

    Android 性能优化之 String篇 关于String相关知识都是老掉牙的东西了,但我们经常可能在不经意的String 字符串拼接的情况下浪费内存,影响性能,也常常会成为触发内存OOM的最后一步 ...

  3. Android性能优化系列总篇

    目前性能优化专题已完成以下部分: 性能优化总纲--性能问题及性能调优方式 性能优化第四篇--移动网络优化 性能优化第三篇--Java(Android)代码优化 性能优化第二篇--布局优化 性能优化第一 ...

  4. Android性能优化之内存篇

    2019独角兽企业重金招聘Python工程师标准>>> Google近期在Udacity上发布了Android性能优化的在线课程,分别从渲染,运算与内存,电量几个方面介绍了如何去优化 ...

  5. Android性能优化之渲染篇(一)

    前言 工作有半年多了,自己的技术没有很大的长进,平时也没有注意学习,只是完成了工作任务就可以了,这样下去的话,自己将很难有提高.面对现在激烈的竞争环境以及技术不断的更新,自己真的要去学习,不断的提高自 ...

  6. Android性能优化之电量篇(四)

    原文链接:http://hukai.me/android-performance-battery/ 1)Understanding Battery Drain 手机各个硬件模块的耗电量是不一样的,有些 ...

  7. Android性能优化之内存篇(三)

    原文链接:http://hukai.me/android-training-managing_your_app_memory/ http://hukai.me/android-performance- ...

  8. Android渲染时间 太长,Android性能优化之渲染篇

    1)基本概念 在一个典型的显示系統中,一般包括CPU.GPU.display三個部分, CPU负责計计算数据,把计算好数据交給GPU,GPU会对图形数据进行渲染,渲染好后放到buffer里存起來,然后 ...

  9. Android性能优化之工具篇 — — 开发者选项

    Google为了方便开发者调试Android程序专门开发了开发者选项功能,能够让开发者方便快捷调试Android应用程序.对于一般用户无需关注,所以往往开发者选项在新版本中都会隐藏,需要特殊操作才会展 ...

最新文章

  1. C与C++之间相互调用
  2. 同一订单类型用多个号码段
  3. Nutanix企业云助力广播传媒的融合媒体发展之路
  4. Android开发--Wifi的操作
  5. wxWidgets学习 (2) -- 事件处理
  6. django 开发中数据库可以怎样优化
  7. 同包类 和 其他类 java_关于继承:为什么Java中的“protected”修饰符允许访问同一个包中的其他类?...
  8. linux 虚拟一个40段ip,linux – 接口上的Multiples ip地址.我想指定其中一个输出
  9. 基于GitHub创建自己的个人网站
  10. 利用whistle调试移动端页面
  11. mysql多表结果合并查询
  12. 安装Numpy的简单方法
  13. 怎样彻底帮妹子解决weditor的安装的问题
  14. 计算机无法读取智能卡,电脑智能卡读卡器驱动程序丢失怎么办?如何重新安装智能卡服务?...
  15. 【目录】pygame网络游戏教程
  16. 链新:探索NFT中国化路径,与实体经济相结合
  17. linux 库全局变量_C语言开发单片机为什么大多数都采用全局变量的形式?
  18. MFC 创建模态与非模态对话框
  19. 一文读懂Kubernetes Scheduler扩展功能
  20. 英特尔oneAPI——异构计算学习总结

热门文章

  1. laravel mysql sum查询并排行_必看!PHP常见面试题——MySQL篇(二)
  2. Java awt Desktop 无法调用系统浏览器
  3. Linux 防火墙命令的操作命令CentOS
  4. 搭建LAMP下的ucenter家园博客
  5. 在linux系统 挂载光盘:mount时提示: you must specify the filesystem type
  6. 代码编辑器——sublime
  7. mongodb 的PHP 扩展
  8. C# http post 地址
  9. sql 备份.bat
  10. Cassandra架构、设计(集群表)和性能报告