Android性能优化篇之计算性能优化

image

引言

1. Android性能优化篇之内存优化--内存泄漏

2.Android性能优化篇之内存优化--内存优化分析工具

3.Android性能优化篇之UI渲染性能优化

4.Android性能优化篇之计算性能优化

5.Android性能优化篇之电量优化(1)——电量消耗分析

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

7.Android性能优化篇之网络优化

8.Android性能优化篇之Bitmap优化

9.Android性能优化篇之图片压缩优化

10.Android性能优化篇之多线程并发优化

11.Android性能优化篇之数据传输效率优化

12.Android性能优化篇之程序启动时间性能优化

13.Android性能优化篇之安装包性能优化

14.Android性能优化篇之服务优化

介绍

Android中的Java代码会需要经过编译优化再执行的过程。代码的不同写法会影响到Java编译器的优化效率。例如for循环的不同写法就会对编译器优化这段代码产生不同的效率,当程序中包含大量这种可优化的代码的时候,运算性能就会出现问题。想要知道如何优化代码的运算性能就需要知道代码在硬件层的执行差异。

1.低效率函数

如果你写了一段代码,它的执行效率比想象中的要差很多。我们需要知道有哪些因素有可能影响到这段代码的执行效率。例如:比较两个float数值大小的执行时间是int数值的4倍左右。这是因为CPU的运算架构导致的,如下图所示:

image1.png

虽然现代的CPU架构得到了很大的提升,也许并不存在上面所示的那么大的差异,但是这个例子说明了代码写法上的差异会对运算性能产生很大的影响。

通常来说有两类运行效率差的情况:第1种是相对执行时间长的方法,我们可以很轻松的找到这些方法并做一定的优化。第2种是执行时间短,但是执行频次很高的方法,因为执行次数多,累积效应下就会对性能产生很大的影响。

修复这些细节效率问题,需要使用Android SDK提供的工具,进行仔细的测量,然后再进行微调修复。

2.Traceview

前面已经讲过,这里就不在介绍了。

3.计算性能优化
(1).批处理与缓存

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


image2.png

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

image3.png

上面就是批处理的一种示例:把重复的操作拎出来,打包只执行一次。
缓存相对比较简单,就是把经常处理的数据先缓存起来,使用时直接获取,但是要注意,当代码执行完毕需要回收(当然也可以使用weakRefrence)。

(2).主线程阻塞

为了确保应用程序的高性能,每项功能都应该尽可能高效地运行。但是这些功能的执行时间以及它们在代码中所处的位置也很重要,当你首次启动一个Android应用程序时,朱执行线程就已经创建了,主线程非常重要,因为它负责运行你的代码,并在合适的视图位置发送事件和执行绘图功能。这些前面我们已经讲过,基本上来说,主线程是应用程序所在的线程,有时候,主线程也称为UI线程。例如,如果你触摸屏幕上的按钮,UI线程将会发送一个触摸事件给视图,视图将按钮状态设定为已按下设定,然后向事件队列发送一个有效请求,然后UI线程处理此请求,并通知按钮将其本身绘制为已按下状态。如果你有任何触摸事件的处理代码块,将会在线程中执行,这些触摸处理所用的时间越长,线程的执行时间就会越长,在绘图功能执行完之前,视图将会更新显示状态,让用户能够看到其状态,这里需要记住的是,输入处理代码与渲染和更新代码,共享这个线程的处理周期时间。


image4.png

这意味着,在触摸事件处理,网络访问或数据库查询等计算周期时间,UI不会更新绘图,在简单的情况下,渲染周期可能会延误16毫秒左右,而让用户感到延迟。但是,如果你暂停UI线程渲染超过5秒,用户将会看到“应用程序未响应”对话框,并询问用户是否会想要关闭你的应用程序,这样可能导致用户停止使用。那你如何解决这个问题,你要找出不需要在主线程上执行的功能,也就是说,不需要等它们完成之后,才能执行绘图。你应该将这个功能转移到一个单独的独立线程,这个线程不会阻止UI线程。例如,如果你按一下提交按钮,以完成一个订单,然后编写和发送确认邮件,
image5.png

这可以在单独的线程上完成。Android有系列很好用的API,能够简化这些工作。

(3).异步任务

给耗时操作建立异步任务,比如网络请求,图片处理等等,任务完成通知主线程。

(4).容器性能

前面我们讲过,一些类型的硬件可能会造成程序执行速度较慢,还记得那个浮点分支问题吗?对于今天的硬件来说,这已经不是问题。但是有一些问题还是需要引起注意,比如说,你所使用的编程语言的基本元素的效率,以排序等基本算法为例,现在,有很多的排序算法,对于不同的情况,它们各有优劣,例如,当元素数量少于一千或在大型已排序列表中寻找一个对象时,快速排序法通常比起冒泡排序法更快。一般情况下,最好的方法是二分查找算法,但是,当在未排数组中寻找对象时情况变得完全不同,不同于比较每一个对象以查找你想要的值。你可以使用一个哈希函数来立即找到它,这是现代计算机科学和数据结构方面的基本知识。

幸运的是,现代编程语言像Java等,为你提供了这些容器和算法,因此你不再需要自己反复地编写Murmur3哈希函数和快速排序算法。但是你需要知道另外一些事情,在我多年的编程生涯中,一个经常会影响项目性能的问题,是由于这些语言提供的容器对象的性能所引起的。这听起来不可思议!Java提供一个矢量类的实现,你可以任意push、pop,添加和取消对象,为了获得这种灵活性,它在内部使用链式列表结构,这种结构具有一系列独特的性能特性,在你操作这种列表时,它的速度超级快,但是,当你在其他位置进行插入或删除时,它会消耗大量的时间。我要说的是,底层系统提供的这些容器并不会考虑,你的程序将会如何实际使用它们,James Sutherland发表了一系列的基准测试报告,他认为,我们需要注意性能与功能之间的一些差异。例如,他发现Hashtable比HashMap大约快22%,具体视你如何使用这些容器而有所不同,我们需要思考的是,你是否曾经分析过你在代码中使用的容器类。你是否坚信,你在代码中使用的容器的实际运行速度绝对是最快的。一个好消息是,你可以使用Android中的MPI来剖析这些容器的性能。


image6.png
(5).数据结构

创建应用时,容器中不恰当的数据结构所造成的性能问题,为此我们可以使用Android SDK中的工具,来识别不恰当数据结构带来的性能问题。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,835评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,598评论 1 295
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,569评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,159评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,533评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,710评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,923评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,674评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,421评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,622评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,115评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,428评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,114评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,097评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,875评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,753评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,649评论 2 271

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 170,569评论 25 707
  • 纪念捧着手机,空洞的看着那一条消息。头顶上昏黄的灯照得纪念的脸色愈发悲凉。“呵,纪念,别想了,他要结婚了。”纪念抬...
    浮生菇凉阅读 2,694评论 0 0
  • 风吹细雨无痕迹,窗前明月无处觅 夜来思愁绪端酒,无处不在斟满杯
    比牛哥阅读 147评论 0 0
  • 做一次自己吧, 仅仅一次就足够了。 去到没有去过的地方, 遇见没有遇过的人, 做些自己喜欢的事。 做一次自己吧, ...
    Ribuprofen阅读 164评论 0 3
  • 发烧后如何合理处理? ① 手脚凉:泡脚,把脚心.手心.搓热。 ② 口渴?适量喝温水,补充身体水份。 ③ 精神不好?...
    mz梅子阅读 478评论 0 0