4、性能:问题&优化&实践

158 阅读6分钟

继续填坑。

关于性能的面试问题,应该每一位面试者每一次面试都会遇到,那具体性能面试时,究竟面试官需要了解什么内容呢?在这里说一下我说一下个人的经验。

我大概会是这么开始这个话题的,请问你在上一份工作中有没有遇到什么性能问题?你能介绍一下吗?

一般情况下我得到的会是这样子的,大概有这么几种情况,

  1. 上一份工作没有遇到性能问题,或者是我没有负责过性能问题的解决;
  2. 之前的工作有一个启动速度优化的问题,我使用了xx技术框架,将启动任务封装/管理/调度起来,启动速度大大提升;
  3. 解决过一个页面卡顿问题,我把view视图复用,使用merge和stub标签降低view层级解决问题,或者是过渡绘制问题,去掉不必要的背景解决问题;
  4. 使用LeakCannary检查内存泄露;
  5. 设置混淆/使用AndResGuard减少包体积;删除不需要资源减少包体积;删除非必要so架构减少包体积等;
  6. 其他的一些优化;

我们回过头看看上面的回答,我对这些回答的观点是太笼统,不可量化,零碎不系统,一点都不STAR,基本上就是照本宣科,为了优化而优化。面试官真正期待的是具体问题的解决过程,类似问题的经验积累。怎么说呢?

性能问题不能是凭空出现的,是项目真正面对的具体问题,也就是说这个问题是真的影响到了用户体验,我们必须要解决。于是我们才开始进入问题解决的过程。

首先我们需要定义问题,也就是回答这个是一个什么问题,为什么会发生这个问题。譬如启动速度,就需要确定一些事实,当前项目启动速度是xx秒,行业平均水平是yy秒,我们需要meet一个业务目标zz秒。跟着我们展开了启动流程分析,android的app启动时,application的生命周期,activity的生命周期,都经历了那些过程,这每个过程都执行了什么任务,每个任务的具体耗时,依赖时序都是怎么样子的,之后我们就可以回答出当前启动速度xx秒的具体构成是怎么回事,是否合理,是否可以优化。

其次我们针对启动速度问题展开调查,当前启动速度可以通过什么方案进行优化提升,行业中有哪些框架适合引入解决当前问题,我们是否需要专门设计开发代码逻辑去解决问题,该问题是否有其他的替代方案。譬如冷启动黑/白屏问题,我们可以通过theme设置解决,也可以通过预加载资源,dsl布局避免io等方式避免黑/白屏问题。如果是application初始化任务串行调度,时序依赖问题,我们可以引入startip框架并行调度,dag算法解决时序依赖;如果是闪屏展示问题,可以通过资源预下载,设计本地时效判断逻辑做端上计算避免网络请求提升启动速度;如果是首页视图展示速度可以通过缓存,视图优先级来提升速度体验。根据具体的问题,针对性的解决方案,进行合理的优先级排序,匹配项目研发周期节点,选择最高投入产出比的方案进行落实

最后需要对落地方案进行跟踪监控,按照实际的上线流程收集数据,评估是否符合预期目标zz秒。否则继续推进性能优化继续执行落地,直到符合预期。至此工具人的任务已经完成。

如果还有积极主动,认真较真的同学,会针对上述的方案进行源码阅读,总结学习建设数据指标体系进行实时监控跟踪总结输出技术文档,开发经验,制定开发制度,防止代码劣化。然后思考这些个方案是否能够解决项目中的其他问题,进行共性问题解决方案封装,整合出代码仓库,lib仓库以供其他项目,或者其他模块使用

我相信无论任何项目,都存在性能问题,存在技术债务,在解决问题的过程中,才是能力的体现。当面试官问出性能问题的时候,只是想了解你是否有良好的问题解决方法:问题定义,问题分析,行业调查,方案选择,落地监控,流程效率,学习总结,举一反三。

而如果确实没有遇到过性能问题的螺丝钉同学,可以通过性能综述的方式来巧妙回答面试官的问题。

回答什么是性能问题?具体有几大类,大概都是什么问题,什么现象?行业中的解决办法和方案是什么?我对此有什么学习经验和心得。大概是这个样子的。

android开发过程中我们会遇到x个方面的性能问题:线程、内存、视图、网络、缓存、包体积、耗电量等等,不用全面,而是能体现你的积累。跟着就展开说线程问题包括启动速度问题、线程并发调度,线程池设计使用,xxxx等,每个点大概存在什么样子的解决方案;内存方面就是内存抖动,内存泄漏,内存溢出,都是什么问题引起的,都有什么解决办法,都可以怎么样解决,等等;最后聊一下我以前研究/阅读过xx源码框架,他是解决什么性能问题的,譬如startup框架,DAG算法;LeakCannary,引用队列;AndResGuard资源混淆;等。把你的能力展现出来。有点有面,积极主动,学习能力强。

以上并不是面试过程的话术,而大概是描述一个知识整理记忆体系。面试过程也是从浅到深,并不是说我们一听到问题,就好像打开开关一样,从头到尾一口气全说出来。

上面并未列举各种各样的性能优化问题,如果大家对每一项性能优化感兴趣,欢迎评论区提问。解决性能问题的关键词也就是三个:懒的、热的、冗余。