导读|Hippy使用JS引擎进行异步渲染,在用户从点击到打开首屏可交互过程中会有一定的耗时,影响用户体验。如何优化这段耗时?腾讯客户端开发工程师李鹏,将介绍QQ浏览器通过切换JS引擎来优化耗时的探索过程和效果收益。在分析Hippy耗时瓶颈、对比业界可选引擎方案后,最终QQ浏览器通过选择使用Hermes引擎、将JS离线生成Bytecode并使用引擎直接加载Bytecode,让首帧耗时优化50%起。希望本文对面临同样困扰的你有帮助。
背景
目前QQ浏览器(下简称QB)使用Hippy的业务超过100个,基本上95%的核心业务都是使用Hippy作为首要技术栈来开发。但是跟Native相比较而言,Hippy是使用JS引擎进行异步渲染,在用户从点击到打开首屏可交互过程中会有一定的耗时,影响用户体验。如何优化耗时,尽量对齐Native体验,想必是许多开发者都在思考优化的事情。
本文主要介绍QQ浏览器通过切换JS引擎来优化耗时的探索过程和效果收益。本文我将分析Hippy执行流程及耗时瓶颈、对比业界JS引擎方案,最终选择使用Hermes引擎。之后分析将JS离线生成Bytecode,使用引擎直接加载Bytecode的能力。值得一提的是,在业务无需修改一行代码的前提下,Hippy的包加载速度提高80%,首帧耗时优化50%起。下面我将展开讲述。
Hippy业务耗时瓶颈分析
Hippy整个启动流程依赖JS线程的执行。我们其实可以将整个过程抽象看成一个串行的操作,以QB冷启动首页Feed流,结合线上数据性能监控可以看到如下阶段耗时:
注:TTI = Time To Interact,意思是从业务创建到业务可交互所花费的时间,因为衡量业务可交互比较复杂,各个业务对可交互的定义不一样,所以这里以首帧上屏为准来衡量;
通过打点分析得到,用户从打开业务创建RootView开始,到最终首帧上屏总共耗时1488毫秒,其中主要在Module初始化、创建HippyCore(bootstrap.js以及common包执行耗时)、业务包执行耗时上。其中加载执行业务包耗时1303毫秒,占整体TTI的87%。
如果我们能够优化加载执行业务包的耗时,那么我们就可以极大的降低TTI。在iOS上Hippy使用的是系统提供的JavascriptCore引擎来运行JS代码,所以我们要分析一下JSC的执行过程。
JavascriptCore执行流程分析
具体流程:词法分析,输出tokens;语法分析,生产AST(抽象语法树);从AST生成字节码; 通过Low Level解释器执行字节码;使用JIT加速解释执行机器码(带JIT的版本)。
注:本文JSC是指苹果官方提供的JavascriptCore.framework,JSC分带JIT与不带JIT的版本,带JIT的版本目前只有苹果自家的Safari能够使用,公开的JavascriptCore因为安全原因(JIT可以动态执行机器码),实际是不带JIT的版本。下面讨论的也是指不带JIT的JSC版本。
整个流程,在JS代码被解释执行前,绝大部分时间消耗是在字节码生成上。如果能将Bytecode生成前置缓存起来,每次执行JS的时候直接取缓存的Bytecode,那将会极大降低耗时。但是很可惜的是,JavascriptCore属于系统库,并没有提供这个能力。我们可以考虑选择其他支持Bytecode的引擎替换掉JSC。
可选引擎对比
除了JSC,常见的开源引擎包括V8、QuickJS、Hermes。
JS引擎
|
是否支持Bytecode
|
SDK大小
|
是否开源
|
作者
|
JavascriptCore
|
如何不改一行代码,让Hippy启动速度提升50%?相关推荐
- c语言一行代码太长,C语言修改一行代码,运行效率居然提升数倍,这个技巧你知道吗...
对编译.链接.OS内核.系统调优等技术感兴趣的童鞋,不妨右上角关注一下吧,近期会持续更新相关方面的专题文章!引言 近日,网上看到一篇文章,分析数组访问的性能问题.文章经过一系列"有理有据&q ...
- 不改一行代码,将微信小程序转成商业App?
Web2.0前期的"眼球经济",即以吸引用户长时间观看内容.使用工具为导向,占有用户的"屏幕时间"(Screen time),从中寻求各种"变现&qu ...
- 不改一行代码!快速迁移 Flask 应用上云
目前大部分应用都以 Web 形式提供,因此 Web 框架开发已经成了不少开发者必不可少的技能.而 Flask 是一种非常容易上手的 Python Web 开发框架,开发者只需要具备基本的 python ...
- 不改一行代码,轻松拥有企业级微服务治理|MSE微服务治理专业版重磅发布
简介:随着业务的发展,微服务拆分越来越复杂,微服务的治理也成了一个比较令人头疼的问题.有没有更加简单且高效的方法来解决微服务治理的难题? 作者:十眠 随着业务的发展,微服务拆分越来越复杂,微服务的治理 ...
- 不改一行代码定位线上性能问题
背景 最近时运不佳,几乎天天被线上问题骚扰.前几天刚解决了一个 HashSet 的并发问题,周六又来了一个性能问题. 大致的现象是: 我们提供出去的一个 OpenAPI 反应时快时慢,快的时候几十毫秒 ...
- 不改一行代码定位线上性能问题 1
作者:crossoverJie 来源:crossoverJie 背景 最近时运不佳,几乎天天被线上问题骚扰.前几天刚解决了一个 HashSet 的并发问题,周六又来了一个性能问题. 大致的现象是: 我 ...
- 不改一行代码!快速迁移 Express 应用上云
作为目前最流行的 Node 框架之一,Express 框架提供了一系列强大特性,帮助用户创建各种 Web 应用和丰富的 HTTP 工具,同时它也是是许多其它流行 Node 框架的底层库. Server ...
- 不改一行代码!快速迁移 Koa 应用上云
Koa 是现在最流行的基于 Node.js 平台的 Web 开发框架之一,由 Express 原班人马打造,利用 async 函数,Koa 丢弃了回调函数,并有力地增强错误处理,受到开发者普遍欢迎. ...
- 梯度中心化,一行代码加速训练并提升泛化能力
来源 | 晓飞的算法工程笔记 优化器(Optimizer)对于深度神经网络在大型数据集上的训练是十分重要的,如SGD和SGDM,优化器的目标有两个:加速训练过程和提高模型的泛化能力.目前,很多工作研究 ...
最新文章
- 嵌入式 ARM 汇编编程例题(二维数组按规律求和,求两数 gcd / lcm,求数组 min / max,字符串复制,排序)
- keras神经网络模型的保存与加载
- OpenVR——驱动接口之IClientTrackedDeviceProvider简介
- 解决gradle项目每次编译都下载gradle-x.x-all.zip gradle-x.x-bin.zip
- 微服务升级_SpringCloud Alibaba工作笔记0008---spring gateway配置路由的两种方式
- 调用指定目录下的批处理bat_批处理(.bat)的奇技淫巧
- 阿里云工程师用机器学习破解雾霾成因
- 字符串处理 BestCoder Round #43 1001 pog loves szh I
- Tomcat的JDBC连接池
- DELPHI7第三方控件安装
- JetChat-简仿微信聊天应用
- 工作中遇到大小端数据存储格式
- 数字战疫|央视聚焦闵行,有信云助力上海数千家企业复工复产
- 【微商】我和99%的人观点不同
- 包对象之Oracle如何编译失效包体
- Python版-LeetCode 学习:322 零钱兑换问题
- xunsearch开发流程(三)
- 【已解决】Java保存数据超时失败 ClickHouse exception, code 1002, 8123 failed to respon,keep_alive_timeout参数
- BLAST+使用方法
- 振兴农村循环经济 和数链串起农业“生态链”
热门文章
- 齐岳:环糊精修饰Fe3O4磁性纳米复合材料|十二烷基硫酸钠(SDS)将Fe3O4磁性纳米粒子定量地修饰到多壁碳纳米管
- 2022电赛C题:小车跟踪(方案1+核心代码)
- C++模板-33-类模板和函数模板的区别
- 十 LVS 负载均衡
- 微信小程序开发入门教程(十)
- SPOJ GSS2 Can you answer these queries II
- 稳住不慌:运维职业成长路线规划
- Java核心技术卷一基础知识第10版demo实例
- python学习笔记之自定义函数
- oracle查找和替换正则,PL/SQL Developer的查找/替换功能中怎样使用正则表达式?
|