好不简单有个不那么忙的周日,本来兴致勃勃的想更新一下博客,结果睡醒照旧一翻开虎扑,发现男篮国际杯日本爆了大冷门赢了芬兰。。。 再想想前两天中国男篮四十二分惨败塞尔维亚,心里顿时超级不是滋味。作为一个篮球热爱者和国家队球迷,真心觉得难过,眼看着国际,甚至亚洲范围内的篮球水平都在逐步进步,好像只要中国男篮一直在原地踏步。
PS: 看到李凯儿, 一个臂展起码210的身材面临一个射手博格丹做低手上篮被盖真的有点无语。。。。
于是这下完全失去了写博客的激情,恨不得马上去健身房做几组深蹲才解气。
直到睡了个午觉休息了一会,我才渐渐缓过来,life goes on。想想或许我不能为中国篮球贡献什么,那起码写点技术博客和文章,假如能协助就任何人,也算是是对社会做出了点牛毛般的贡献,总比我坐在家打游戏难过一天强。。。
Ok,借着这个渠道输出了不少私货,咱们聊正题!
功能剖析,进步?怎么办?
其实每次看到领导要求做功能进步或者优化我都菊花一紧,严重的不可。由于基本上功能优化是超级难做, 而且很难出成果的活。其他人不停的发新功能,疯狂吃RAM,轮到我便是帮忙做优化,说白了便是帮别人拾掇烂摊子。。。。硬件就这么个水平,每次版别更新都加新功能,那怎么会不卡??????
这谁顶得住,太难办了。浩南哥说。
所以许多功能优化最后出的数据都是有必要有必定先决条件才建立的。比方用户在一同翻开某几个app的时分,内存削减xx百分比,或者用户设备在radio关闭时等等。都是在某一些特别的用例下才干处理。
或者是开发者对某个app的事务逻辑十分了解,直接在事务逻辑上做减法,比方本来发动的时分需求初始化 A B C,现在为了削减app的IO操作删去B C 把他们挪到app敞开之后在做等等。
这种优化一般都需求开发者对代码十分熟悉,由于这样更简单定位代码,而且数据进步上会更好看,比较直接。
可是安卓app或者体系的开发方法论现已很成熟了,一些很低级的过错咱们都很少犯了。大部分很简单定位的过错在代码检查的时分就能够发现。针对某个线程某一个代码能做的优化真的太少了。做优化经常需求好几个进程一同做剖析。
功能剖析,盲人摸象?
许多状况下,做优化的人不必定懂事务逻辑代码,至少不是百分百懂。至少在许多做体系的大厂,功能优化一般都是许多个不同组的人集合到一同做的。安卓开发到现在,每个小模块都牵涉好几个团队开发,假如要针对某一个用户需求做优化,可能需求至少三个团队一同,可是互相也都不太熟悉对方代码。
这种状况下,之前说的方法论就不太管用了。咱们需求对一个用户需求做大局的体系级别剖析。
咱们能够结合之前说过的Perfetto 东西说说怎么看体系大局的功能剖析。经过检查CPU的运转状况看看究竟为什么这么慢。
从哪里来到哪里去
再剖析之前,开发者至少需求确认你要检查的用户需求从什么时分开端到什么时分结束。Perfetto的默认设置是不保存Log文件的,没有log肯定是没法确认时刻的。这儿咱们需求加上Log的filter设置,告诉perfetto你需求检查哪些log。
保存好之后,运转取得trace,你能够看到你的Perfetto UI下面呈现了日志,最要害的是,这些日志能够直接被定位到CPU运转的时刻线上
你还能够在对应的时刻线上插上一个小旗子!
在确认好日志在时刻线上的位置之后,开发者能够专注于这个时刻片段内产生的工作了!
CPU啥状况?
翻开Perfetto UI之后,最上面一行便是CPU的执行状况。就像github的提交状况相同,色彩越深,越绿,代表CPU越繁忙。
我抄好绿!!!
比方下面这个图中
选中的这1.5秒内,CPU简直绿的发指!后面就渐渐的变白了,阐明这1.5秒内CPU基本上是满负荷的运转,假如在这个过程中发动进程线程过多,那就会呈现cpu starvation。 咱们都想跑东西,可是都分配不到CPU cycle。这种状况下速度必然会变慢。
哪些进程有毛病?
Perfetto能够记载CPU在任意时刻分配给了哪些进程。上图这一栏就记载了密密麻麻的运转记载。每个小色彩块代表了同一个进程。
放大看就能够看出端倪。
system server 在选中的这一段中分配了很多cpu cycle!
假如你把鼠标悬浮在上面,你还能够看到某一个进程在时刻段中的占比
System server 真的跑了很多!!!
进程详细跑了多久?
用鼠标把选中的CPU区域包起来,Perfetto会主动计算该时刻段一切进程的运转状况
你能够很清楚的看到System server 在1.5秒内分配了快900ms的CPU时刻,是整个体系中分到的大头。
进程详细跑了多久?
在确认可疑的进程之后,能够聚焦该进程,检查进程中的哪些线程在占用CPU
Binder 相关的线程占用173ms! 考虑跟进system server详细创建了哪些binder,是不是有些进程不需求bind?削减Binder 开释更多CPU cycle?
选定了时刻段之后,也能够按照线程来排序,这样更便利分辨同一个进程中不同的线程运转状况。
果然这个binder 线程好像有点太占CPU了?
经过上面一些检查CPU运转状况的技巧,咱们基本上能够剖析出在这段时刻内哪些进程占CPU的大头。削减不需求的进程或者线程的运转,能够开释更多CPU cycle 给有必要的事务逻辑线程或者进程。一同需求注意的是,进程线程越多,需求的内存肯定也越多,当内存经常性的超过极限就会呈现更多的swap,这时任何的操作都会变慢,延迟会呈现雪崩式的上升。
主动化
其实以上的剖析关于一个复杂的体系来说还是略显不准确。比方在我这次剖析里面,体系进程还有JIT 相关的使命,而且还适当活泼。
这阐明我在测验的时分可能刚刚刷完体系,这样的测验随机性太大。JIT相关的线程可能会大量占用CPU cycle不说,还会伴随着许多垃圾回收使命。这对功能讲究不公平。
咱们需求有一套主动化的体系,做持续不断的主动化测验,一同计算某个用户需求的延迟,还有CPU运转状况的数据 (中位数?最差状况 ?最好状况?等等)。Perfetto供给相关数据的SQL query,也便是说咱不需求每次都翻开UI 东西手动点击时刻段剖析,这样是无法主动化的。详细的SQL怎么写官网都有这儿就不细说了。
比方,每次在开发者提交了一个可能会影响到功能的代码之后,CI体系需求跑这个需求N次,计算以上涉及到的数据和之前进行比照,看看有没有显着的功能倒退现象。
甚至在你做性那剖析之前,就需求找好对照组进行试验(比方某个版别和某个版别之间的比照),做到有的放矢,究竟快慢都是相对的。
能够说主动化和对照组,是功能剖析最最要害的部分了。只要找出了问题的真实所在,才干谈技术上怎么处理。
- 主动化测验结构和试验室条件
- Perfetto SQL query
- 试验对照组
以上三点几乎缺一不可。
最后
写完这篇文章的时刻是北京时刻六点半,间隔男篮vs南苏丹还有几个小时,衷心祝愿中国男篮能够和我这篇文章的主旨相同,功能再优化一些。干赢南苏丹前进奥运啊!!!!!!
周琦,李凯儿你们两个硬一点啊!