轻松入门大数据:玩转Flink,打造湖仓一体架构-亲劳簪组送,欲趁莺花还

#1

download:轻松入门大数据:玩转Flink,打造湖仓一体架构

Android性能优化方法
作为开发人员,性能优化是一个永远绕不过去的话题,我们相信在日常开发中都会接触到。Android的性能优化其实已经很成熟了,有成熟的套路,成熟的方法论,成熟的开源框架等等。
对于性能优化经验不多的开发者来说,可能很少有机会总结或学习这些成熟的例程、方法论或框架。所以,作为一个做了多年性能优化的开发者,本文总结了性能优化的方法论,供大家参考。

性能优化的本质
首先,我来介绍一下性能优化的本质。我对其本质的理解是:性能优化的本质是合理、充分地利用硬件资源,使程序性能更好,更好的程序性能的目的是从客户那里获得更多的利益,如留存、使用时间、信誉、利润等。
所以从本质上讲,性能优化最重要的两件事是:

并且合理地充分利用硬件资源。

让节目表现更好,盈利。

先说这两件事。
并且合理地充分利用硬件资源。
充足意味着可以充分利用硬件资源,但充足不一定合理。比如我们一次打几百个线程,cpu被充分利用了,但是并不合理。因此,可以合理地说,所利用的硬件资源可以对程序性能产生积极影响。
硬件资源包括:CPU、内存、硬盘、电、流量(不属于硬件资源,也是需要合理使用的资源之一)等等。
下面是一些合理充分利用硬件资源的例子:

cpu资源利用率高,但不超载,CPU资源主要用在当前场景,而不是被整个业务分散消耗。比如我们优化页面打开速度,这和cpu有很大关系,那么首先要保证cpu得到充分利用。我们可以使用多线程,在打开前预加载页面,充分利用手机的cpu。但在打开页面时,要合理保证cpu资源主要被与页面打开相关的逻辑使用,如组件创建、数据采集、页面渲染等。至于其他和当前页面打开场景联系不大的逻辑,比如周期性任务,监控,或者一些预加载等等。,都可以关闭或延迟,以减少无关任务的cpu消耗。

内存资源使用缓慢且充分,OOM等异常可以控制在合理的范围内。比如我们做内存优化的时候,内存优化越少越好。相反,更多的内存占用可能会让程序更快,但内存占用不能太高。因此,我们可以根据不同型号的OOM率,将内存占用控制在充分利用、合理的状态。在低端电脑上,可以通过函数降级等优化减少内存的使用,而在高端电脑上,可以适当增加内存占用,让程序性能更好。
……

让节目表现更好,盈利。
我们有很多直接的指标来衡量我的性能优化的收益,比如pss,java内存占用,原生内存占用等等。速度优化,可以用启动速度和页面打开速度;做卡顿优化,这个用帧率之类的。掌握这些指标非常重要,我们需要知道如何正确地、低成本地监控这些指标。
除了上面的直接指标,我们还需要知道性能优化的最终指标,用户留存率,使用时长,转化率,好评率等指标。有时候,这些指标是最终衡量我们性能优化结果的数据。比如我们做内存优化,pss减少了100 M,但仅仅因为内存使用量减少了100M,并没有太大的增益。如果这100 M体现在应用生存时间和转化率的提升上,那么这100M的优化是值得的,向上汇报我们的产出更容易得到认可。
如何优化性能
说完性能优化的本质,我再来说说怎么做好。我主要从以下三个方面来阐述。

知识储备

思考的角度和方式
形成一个完整的闭环。

知识储备
要想优化性能,尤其是原创,或者完善系统,或者有效优化,不是在网上看一些文章然后模仿就能做到的。我们需要扎实的知识储备,然后基于这些知识储备,通过深入思考,分析我们的应用,找到优化点。我还是举一些例子来说明硬件层面、系统层面、软件层面的知识可以帮助我们优化性能。
硬件级别
在硬件层面,我们需要知道处理器的架构和内存的层次结构。如果我们不知道cpu由多少个核心组成,哪些是大核心,哪些是小核心,我们就不会想到把核心线程绑定到大核心来提升性能的优化方案;如果不知道存储结构中寄存器、缓存和主存的设计,就无法针对这种特效提高性能。例如,将核心数据尽可能多地放在缓存中,可以提高很多与速度相关的性能。
系统级
对操作系统的熟悉和了解也是帮助我们优化性能不可或缺的知识。这里我列出了系统层面需要掌握的知识,但并不完整。Linux的知识包括管理和调度、内存管理、虚拟内存、锁、IPC通信等。Android系统知识包括虚拟机,核心服务如ams,wms等。、渲染,以及启动、活动开启、安装等一些核心流程。
如果不了解Linux系统的进程调度系统,就无法充分利用进程优先级来帮助我们提高性能。如果我们不熟悉Android的虚拟机,那么围绕这个虚拟机的一些相关优化,比如oom优化或者gc优化,就无法很好的进行。
软件级别
软件层面就是我们自己开发的App。在性能优化中,我们需要尽可能熟悉自己开发的应用程序。比如我们需要知道我们开发的App里有哪些线程,它们在做什么,这些线程的cpu消耗,占用了多少内存,占用了哪些业务,缓存命中率等等。我们需要了解我们开发了哪些业务,这些用途是做什么的,使用率是多少,资源的消耗等等。
除了上面提到的三个层次的知识,想要做好性能优化,还需要掌握更多的知识,比如汇编、编译器、编程语言、逆向等等。比如用c++写代码比用java写代码快。我们可以通过用c++替换一些服务来提高性能;比如编译时的内联优化和无用代码剔除,可以减少包的大小;反向在性能优化方面也非常有用。通过逆向,我们可以修改系统的逻辑,使程序执行得更好。
如你所见,要想做好性能优化,需要庞大的知识储备,所以性能优化更能体现开发者技术的深度和广度,这也是为什么你在面试时一定会问到性能优化的原因。这是一个不可能一下子形成的知识储备,需要我们慢慢学习和积累。

思考的角度和方式
说完了知识储备,再来说说思考的角度和方式。需要注意的是,它和知识储备没有关系,也不代表你要有足够的技术知识才能开始思考如何思考。思考的角度和方式体现在我们发展的所有生命周期中。即使是新手的开发,也可以训练自己从不同的角度和方式去思考。下面谈谈我对性能优化过程中的角度和思维方式的认知。为了让大家有更好的理解,我先从优化开始解释。
思维角度
在这里,我主要从应用层、系统字、硬件层三个角度介绍我对启动速度优化的思考。
应用层
在优化启动速度时,如果从应用层考虑,我会考虑利用率、必要性等。根据服务的维度对加载的服务进行排序,然后设置优先级,启动时只加载第一屏或者使用率高的服务。然后我可以设计一个启动框架来管理任务。启动框架要有一个好的优先级,可以统计这些初始化任务的使用率或者其他性能,比如这些任务初始化后被使用的概率,或者初始化后业务的性能提升在哪里,有多大帮助。
从应用层思考,主要是基于业务控制或者业务优化来提升性能。
系统层
以及系统层面考虑启动优化,也有很多点,比如线程和线程优先级维度,启动时如何控制线程数量,如何提高主线程优先级,启动时如何减少无关线程,比如gc线程等等。
硬件层
从硬件层面,可以从cpu利用率、缓存命中率等维度考虑启动优化。
除了上面提到的角度,我们可以有更多的角度。比如在这个设备之外思考,其他设备是否可以帮助我们加快启动速度。Google play也有类似的优化。gp会上传一些其他机器编译的机器码,然后同一个设备下载这个应用的时候,也会用它下载这些编译的机器码。还有一种很常见的服务器端渲染技术,就是让服务器端line渲染界面,然后直接临时静态化模块,提高页面打开速度;还是站在用户的角度去思考,思考什么样的优化对用户的感知有好处。比如有时候我们在做启动或者页面打开速度优化的时候,会给用户一个假的静态页面让用户感知到已经打开了,然后绑定真实的数据。
在做性能优化的时候,考虑的角度多一些,全面一些,可以帮助我们想出更多的优化方案。
思维方式
除了训练我们从不同角度思考,还可以训练自己的思维方式。这里有两种思考方式:自上而下和自下而上。
从上到下
我们在做启动优化的时候,自上而下的优化思路可能是直接从启动开始,然后分析启动过程中的环节,然后找到耗时的函数,把耗时的函数放在子线程或者懒加载中,但是这种方式会导致优化不彻底。举个例子,如果把耗时的任务都放到子线程上,我们高端电脑的速度确实会变快,但是在低端电脑上,启动速度可能会降低,因为低端电脑的cpu很差,线程很多,导致cpu满负荷,主线程反而拿不到运行时间。其次,如果从上层来看,一个函数执行时间长,可能不是这个函数的问题,也可能是因为函数长时间没有获取cpu时间。
自上而下的思维很容易让我们忽略本质,导致优化的效果不明显或者不完整。
从下
自下而上的思维就是从底层开始,或者以创业优化为例。自下而上的思考,就是不直接分析启动环节,寻找慢的功能,而是直接思考在启动过程中如何合理充分的利用cpu资源。这个时候,我们有很多计划。比如我们可能会认为不同型号的cpu能力不同,所以会分别针对高端机和低端机进行优化。在高端机上,我们尽量让cpu利用率更高,在低端机上尽量避免cpu过载,用慢函数、线程、锁等知识进行优化。,以便我们能制定一套系统和完整的启动优化方案。

完全闭环
以上都是关于如何优化的。优化很重要,但不是全部。在实际的性能优化中,我们需要做监控、优化、抗降级、数据收入收集等工作。这些部分都要做好,才能形成一个完整的闭环。我来逐一说说这几个部分:

监控:完全监控应用程序中的性能指标是不够的。我们还需要尽可能地监控归因。比如内存监控,我们不仅要监控自己应用的内存指标,还要监控各种业务、大收藏、大图片、大对象等归属项的内存使用率。我们的监控也应该基于性能考虑来设计。完整的监控可以帮助我们更有效地发现和解决异常。

优化:优化就是前面提到的,合理充分的利用硬件资源,使程序性能更好。

防变质:可以做很多事情来防止变质,包括建立完善的离线性能测试,在线监测报警等。比如内存,我们可以每天通过monkey offline运行内存泄漏并提前管理,这是防降级的。

数据收入收集。学会利用好A/B测试,关注核心价值观的指标。比如我们在做内存优化的时候,一味的追求应用内存使用量的减少并不是最优的。过多的内存使用可能会使我们的程序运行得更快,用户体验更好。所以我们需要结合崩溃率、留存率等核心价值指标来确定内存是否要继续优化或者优化多少。

总结
以上是我在多年的性能优化经验中总结出来的认知和方法论。只有了解这些方法论,我们才能放心地进行性能优化。