加入收藏 | 设为首页 | 会员中心 | 我要投稿 云计算网_宿迁站长网 (https://www.0527zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 运营中心 > 建站资源 > 网站推广 > 正文

手淘双十一521 性能优化项目揭秘

发布时间:2016-02-27 14:40:26 所属栏目:网站推广 来源:阿里百川专区的网站
导读:亿万用户都会在双十一这一天打开手机淘宝,高兴地在会场页面不断浏览,面对琳琅满目的商品图片,抢着添加购物车,下单付款。为了让用户更顺畅更方便地实现这一切,做到“如

除了优化到达率,手淘还做了url解CDN Combo后再映射的优化工作,若 URL 是 Combo URL,那么会对 URL 解 Combo,解析出其中包含的资源。然后尝试从本地读取包含的资源,如果所有资源都在本地存在,那么将本地文件内容拼装为一份完整文件并返回;否则 URL 直接走线上,不做任何操作。

提升到达率和解CDN Combo再映射,这两个容器侧对于离线化方案的优化对于本次H5链路上整体性能的提升有着至关重要的意义。

前端组件:请求控制,域名收敛,图片库,前端性能CheckList

严格执行性能方面的CheckList,主要有三个点:

图片资源域名全部收敛到gw.alicdn.com;

前端图片库根据强弱网和设备分辨率做适配;

首屏数据合并请求为一个。

在执行中,性能的检查和校验一定要纳入到发布阶段,否则就不是一个合理的流程。性能的工具和校验一定应该是工程化,研发流程里面的一部分,才能够保障性能自动化,低成本,不退化。

通过以上优化方案,H5页面的平均Loadtime在Wifi,4G下均如期进入1秒,3G和2G也有80%多达成1s法则的目标。

第二章 启动时间和页面帧率20%的提升

很多App都会遇到以下几个常见的性能问题:启动速度慢;界面跳转慢;事件响应慢;滑动和动画卡顿。

手机淘宝也不例外。我们分为两部分来做,第一部分是启动阶段优化,目的解决启动任务繁多,缺乏管控的问题,减少启动和首页响应时间。第二部分是针对各个界面做优化,提升界面跳转时间和滑动帧率,解决卡顿问题。双十一性能优化目标之一就是将启动时间和页面帧率在原有基础上继续优化提升20%,接下来就从这两部分的优化过程来做一一介绍。

一、启动阶段的优化

手机淘宝作为阿里无线的航母,接入的业务Bundle超过100个,启动初始化任务超过30个,这些任务缺少管控和性能监控。

那么首要任务就是:

建立任务管理机制

所有的初始化任务可以用两个维度来区分:

任务必要性:有些任务是应用启动所必需的,比如网络、主容器;有些任务则不是必需的,仅仅实现单个业务功能,甚至是为了业务自身体验和性能而考虑在启动阶段提前执行,其合理性值得推敲。

任务独立性:将应用的架构简单分成基础库、中间件、业务三层,这三层中业务层最为庞大,其初始化任务也最多。对于中间件来说,其初始化可能依赖于另外一个中间件。但对于一个独立的业务模块来说,其初始化任务应该也具有独立性,不存在跟其他业务模块依赖关系。

启动阶段任务管理机制包含了如下几方面的内容

任务可并行

既然很多初始化任务是独立的,那么并行执行可以提高启动效率。

任务可串行

虽然我们期望所有初始化任务都相互独立,但是在实际中不可避免会存在相互依赖的初始化任务。为了支持这种情况,我们设计任务的异步串行机制,这里主要借鉴了前端的Promise思想实现。

任务可插拔

面对这么多不同优先级的初始化任务,任何一个出现异常都会导致应用不能启动,给稳定性带来严重挑战。因此我们设计了可插拔机制,当某一项初始化任务出现问题时能够跳过该任务,从而不影响整个应用的启动使用。这里我们根据初始化任务的必要性做了区分,只有非必要的初始化任务才会应用可插拔的特性,这也是为了防止出现不执行一个必要的初始化任务导致应用启动使用出现问题。

任务可配置

在ios上通过plist指定每一项启动任务, 其中字段optional表示该项是否是必需的,当之前运行出现crash或者异常时,若值为YES则可以不执行该项。

有了任务管理机制,并引入懒加载的理念,可以持续地合理有效管控启动阶段的各项初始化任务,是大型app必不可少的环节。

检测超时方法,优化主线程

性能优化前,初始化代码都在主线程中执行,为了启动性能已将部分初始化任务放入后台线程或者异步执行。但是随着手淘业务发展和人员变更,还是出现了在主线程中执行很重的初始化任务。为此,在ios实现了一套应用运行时方法耗时检测机制,能够对应用中所有类的方法调用做耗时统计。方便的找到超时的方法调用之后,就可以有针对性的做出修改,或删除或异步化。这种方法调用耗时检测机制同样适用于APP运行过程中,从而找到导致应用卡顿的根本原因,最后做出对应修改。

多线程治理

分析各个模块的线程数量,检查线程池的合理性。通过去掉不必要的线程和线程池,再控制线程池的并发数和优先级。进一步通过框架层的线程池来接管业务方的线程使用,以减少线程太多的问题。

减少IO读写

从自身业务出发,去除若干初始化阶段不必要的文件操作,以及将若干非实时性要求的文件操作延后处理。Android上对于频繁读写数据库和SharedPreference以及文件的模块,通过增加缓存和降低采样率等手段减少对IO的读写。对于SharedPreference进行了专门的优化,减少单个文件的大小,将毫无联系的存储键值分开到不同文件中,并且防止将大数据块存储到SharedPreference中,这样既不利于性能也不利于内存,因为SharedPreference会有额外的一份缓存长期存在。

降级部分功能

例如摇一摇功能,测试发现应用场景不频密,但业务使用了高频率的游戏模式,会耗电及占用主线程时间。对该功能做了降级处理,降低检测频率。同理,对于其他非必须使用但又占据较多资源的模块也都做了适当的降级处理。

热启动时间的缩短

在安卓手机上我们把启动分为两类进行检测和优化:冷启动和热启动。冷启动是程序进程不存在的情况下启动,热启动是指用户将程序切换到后台或者不断按Back键退出程序,实际进程还存在的情况下点击图标运行。

之前安卓手淘在按Back键退出时整个首页Activity销毁了,热启动会经过一个比较长的过程。优化后首页在退出的时候并不销毁Activity,但是会释放图片等主要资源,在下次热启动时就能更快的进入。另外,将手淘欢迎页的界面从其它bundle转移到首页的模块,在进入欢迎页时就开始初始化首页资源,做到更快展示。

在经过一系列的优化后,启动方面已经有了明显的改善,在进入首页的时候不会卡顿,GC次数也减少了一半以上。

二、各个界面的优化

(编辑:云计算网_宿迁站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读