导读|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%?相关推荐

  1. c语言一行代码太长,C语言修改一行代码,运行效率居然提升数倍,这个技巧你知道吗...

    对编译.链接.OS内核.系统调优等技术感兴趣的童鞋,不妨右上角关注一下吧,近期会持续更新相关方面的专题文章!引言 近日,网上看到一篇文章,分析数组访问的性能问题.文章经过一系列"有理有据&q ...

  2. 不改一行代码,将微信小程序转成商业App?

    Web2.0前期的"眼球经济",即以吸引用户长时间观看内容.使用工具为导向,占有用户的"屏幕时间"(Screen time),从中寻求各种"变现&qu ...

  3. 不改一行代码!快速迁移 Flask 应用上云

    目前大部分应用都以 Web 形式提供,因此 Web 框架开发已经成了不少开发者必不可少的技能.而 Flask 是一种非常容易上手的 Python Web 开发框架,开发者只需要具备基本的 python ...

  4. 不改一行代码,轻松拥有企业级微服务治理|MSE微服务治理专业版重磅发布

    简介:随着业务的发展,微服务拆分越来越复杂,微服务的治理也成了一个比较令人头疼的问题.有没有更加简单且高效的方法来解决微服务治理的难题? 作者:十眠 随着业务的发展,微服务拆分越来越复杂,微服务的治理 ...

  5. 不改一行代码定位线上性能问题

    背景 最近时运不佳,几乎天天被线上问题骚扰.前几天刚解决了一个 HashSet 的并发问题,周六又来了一个性能问题. 大致的现象是: 我们提供出去的一个 OpenAPI 反应时快时慢,快的时候几十毫秒 ...

  6. 不改一行代码定位线上性能问题 1

    作者:crossoverJie 来源:crossoverJie 背景 最近时运不佳,几乎天天被线上问题骚扰.前几天刚解决了一个 HashSet 的并发问题,周六又来了一个性能问题. 大致的现象是: 我 ...

  7. 不改一行代码!快速迁移 Express 应用上云

    作为目前最流行的 Node 框架之一,Express 框架提供了一系列强大特性,帮助用户创建各种 Web 应用和丰富的 HTTP 工具,同时它也是是许多其它流行 Node 框架的底层库. Server ...

  8. 不改一行代码!快速迁移 Koa 应用上云

    Koa 是现在最流行的基于 Node.js 平台的 Web 开发框架之一,由 Express 原班人马打造,利用 async 函数,Koa 丢弃了回调函数,并有力地增强错误处理,受到开发者普遍欢迎. ...

  9. 梯度中心化,一行代码加速训练并提升泛化能力

    来源 | 晓飞的算法工程笔记 优化器(Optimizer)对于深度神经网络在大型数据集上的训练是十分重要的,如SGD和SGDM,优化器的目标有两个:加速训练过程和提高模型的泛化能力.目前,很多工作研究 ...

最新文章

  1. 嵌入式 ARM 汇编编程例题(二维数组按规律求和,求两数 gcd / lcm,求数组 min / max,字符串复制,排序)
  2. keras神经网络模型的保存与加载
  3. OpenVR——驱动接口之IClientTrackedDeviceProvider简介
  4. 解决gradle项目每次编译都下载gradle-x.x-all.zip gradle-x.x-bin.zip
  5. 微服务升级_SpringCloud Alibaba工作笔记0008---spring gateway配置路由的两种方式
  6. 调用指定目录下的批处理bat_批处理(.bat)的奇技淫巧
  7. 阿里云工程师用机器学习破解雾霾成因
  8. 字符串处理 BestCoder Round #43 1001 pog loves szh I
  9. Tomcat的JDBC连接池
  10. DELPHI7第三方控件安装
  11. JetChat-简仿微信聊天应用
  12. 工作中遇到大小端数据存储格式
  13. 数字战疫|央视聚焦闵行,有信云助力上海数千家企业复工复产
  14. 【微商】我和99%的人观点不同
  15. 包对象之Oracle如何编译失效包体
  16. Python版-LeetCode 学习:322 零钱兑换问题
  17. xunsearch开发流程(三)
  18. 【已解决】Java保存数据超时失败 ClickHouse exception, code 1002, 8123 failed to respon,keep_alive_timeout参数
  19. BLAST+使用方法
  20. 振兴农村循环经济 和数链串起农业“生态链”

热门文章

  1. 齐岳:环糊精修饰Fe3O4磁性纳米复合材料|十二烷基硫酸钠(SDS)将Fe3O4磁性纳米粒子定量地修饰到多壁碳纳米管
  2. 2022电赛C题:小车跟踪(方案1+核心代码)
  3. C++模板-33-类模板和函数模板的区别
  4. 十 LVS 负载均衡
  5. 微信小程序开发入门教程(十)
  6. SPOJ GSS2 Can you answer these queries II
  7. 稳住不慌:运维职业成长路线规划
  8. Java核心技术卷一基础知识第10版demo实例
  9. python学习笔记之自定义函数
  10. oracle查找和替换正则,PL/SQL Developer的查找/替换功能中怎样使用正则表达式?