从1月10号第一篇文章开始,到现在过去了4个月又20天,陆续写下了性能优化系列文章共计十二篇,大概一个月三篇的节奏。本篇文章是性能系列文章的最后一篇,没有新的大方向优化,讲一下写性能优化系列文章的些许事情:初心,过程,所得。
1、 初心
1.1 为什么要做全方位、深入的性能优化?
故事发生在去年年底:某版本上线前当我打开App,唯一的体验就是那如同乌龟爬行般的启动速度。不仅被竞品碾压,更是碾压了我的技术荣辱心:自己做出的App表现差,就是自己差!这是我下定决心要对项目做性能优化的起因。
1.2 为什么写系列文章?
既然要实践性能优化,而我自己也有知识整理的习惯,那么写系列文章自然是水到渠成,顺便是对自己的一个督促。但还有一个原因:
- 翻阅各种资料,我发现,官方文档作为性能优化过程中最佳的参考资料,而国内开发者的翻译水平不敢过于恭维以及很多开发者关注的角度不一,导致很少有优秀并且全面的参考文章。
那既然我要做性能优化,就挑战下这个优秀且全面。也留下好的参考文章给后来的人!
2、 过程
2.1 性能优化不是温馨的请客吃饭
性能优化的过程是一个非常困难的过程,需要你对优化的方向不仅有知识上的充足储备还要有对现存业务上的了解。拿第一篇App启动优化来举例:
- 查看官方文档对启动优化的概述;
- 梳理App启动的逻辑;
- 使用工具对启动逻辑代码进行准确的度量;
- 针对瓶颈确定优化方案;
- 优化、测试。
难点在于中间三步:
- App多人开发,又历经多个版本,没人说得清App启动有多少逻辑以及补偿逻辑;
- 不同风格的代码读起来,那感觉绝对是一个酸爽;
- 确认了问题点,如何优化?重构还是重做?
而整理文章的过程更是难上加难,发布出来文章就是自己的一种承诺,既要具备专业性、又要通俗易懂;既要有深度,优化的招数又要尽可能的全面。因此查文档、翻源码是家常便饭。而平时工作也较忙,因此对于一个月三篇的节奏我甚至觉得有点高产(捂脸)。
2.2 对优化,其实你只是一知半解
谈到性能优化,相信各位开发Android的老司机和新司机,都能说上几句。而在面试过程中性能优化也是必问的姿势。但人人都能说几句并不代表对性能优化的理解有多少,不信看几个问题:
- Android的内存管理在Dalvik和ART上有什么区别?通过adb获取内存信息时,哪个值是真正可回收的内存占用量?
- 如何计算资源图片所占的内存?
- 线程的优先级和进程有关吗?
相信不少司机肯定说不全,但这条估计要让崇尚“背诵记忆准则”的小伙伴们笑了:我不理解原理,但也能说出几条优化的规则,你安能说我不懂性能优化?诚然性能优化有很多经验、准则可以参考借鉴,但是性能优化却不应该是背诵记忆的机械动作。如果不理解原理,对性能优化的认识、理解不足,任何场景都拿统一的套路生搬硬套,那优化的深度、全面性、适用性一定会大打折扣。
3、 所得
那么在这个并不轻松的性能优化过程中,我得到了什么?
3.1 对产品业务的熟悉
性能优化看似是个纯技术的事情,但是实际上和业务密不可分,毕竟任何技术都是在具体的业务场景下实践应用。因此不熟悉模块业务、具体实现而生搬硬套的话,性能优化工作往往无从下手。
3.2 对性能优化的深入理解
性能优化不是一块孤立的知识,对性能优化的深入理解需要方方面面的技术为辅助,此处仍然以第一篇启动优化为例。
- 应用启动分类及过程;
- 启动优化方式;
- Heavy app initialization(包含线程使用、网络请求、IO、布局嵌套等)。
尤其是第三点:每一项都有可能导致性能的瓶颈,而每一项都可以展开阐述,这个过程使你的技术能力得以强化。
3.3 知识整理和文档能力
大多数情况下,我们都不创造知识而只是知识的搬运工,一般做的就是对知识的搜集和整合。那对我们决胜就是快速的汲取知识以及完成对知识的判断及整合,知道什么地方会有权威、靠谱的资料,判断知识的使用场景等。
而写文章过程中的各种痛苦也不是无用功,经历过不知道怎么写文章的窘迫,才会知道怎么确定文章主题、主线、丰富文章,才会锻炼到自己的表达能力、文字组织能力。
4、 其它
4.1 为什么要重视性能优化?
- 性能优化的学习与实践是技术人员成长进步的一条途径,同时也是改善代码质量的一次机会。
- 伴随着App功能的增多,性能问题随之而来,不夸张的说任何App都有性能问题,只是程度不同。任由性能问题存在却视而不见最终一点会有集中式的爆发,那后果不仅仅是技术上的失责,更会影响产品及用户。
- 性能优化的过程本身也是一个精益求精的过程,代表了你对代码的重视,对高质量应用的追求。
4.2 性能优化有哪些好的资料推荐?
- Android性能优化典范,官方推出,必属精品。不仅仅告诉你哪里有问题,更告诉你为什么!
- 胡凯的博客,翻译了关于Android性能优化典范的内容,不想看视频的话可以参考博客。不过官方的典范及翻译都是偏理论性,需要自己去实践。
- 官方文档,不管是Training模块还是API模块,都藏了很多干货。
- 《移动App性能评测与优化》,腾讯TMQ专项测试团队的大作,深入底层,追本溯源,精益求精,带给人技术上提升的同时更端正做技术的态度,强烈推荐!
4.3 对性能优化,平时怎么做?
四个字:防微杜渐。很多性能方面的问题都不是一朝一夕产生的,例如OOM,导致OOM发生的代码可能只是压死骆驼的最后一根稻草,前面很多地方已经埋下了隐患,只等最后一个地方点燃。还有很多代码本身并没有错,确实实现了功能,但是放错了位置。
模块开发之前最好对技术方案进行评审,从实现上(源头)尽早规避低性能的实现方式;最好在功能完成之后,使用工具进行性能的分析,进行针对性的优化。
4.4 其它
- 优化完成之后务必充分测试,否则虽然性能是高了但是出现Bug也是不能接受的;
- 推荐大家写博客,或者整理、总结也好;
- 不忘初心,方得始终。
欢迎关注微信公众号:定期分享Java、Android干货!
欢迎关注
网友评论