自从 Google 的 Flutter 发布之后,Facebook 对 React-Native 的迭代开始快了起来,优化 React-Native 的性能表现,避免被 Flutter 比下去。最近一个比较大的动作是开源了一个 JavaScript 引擎,并将其包含到 React-Native 中。那么这款引擎它有什么不同,相比 V8、JSC 这些 JavaScript 引擎又有什么优势呢,现在本文来为你揭晓。

1.Hermes 引擎是什么,优势有哪些?

重要的事情提前说:Hermes 引擎是 Facebook 研发,在 React-Native Android 端用于替换 JavaScript Core 的 JavaScript 引擎。Hermes 引擎的优势是适合移动端的轻量级 JavaScript 引擎,使用 aot 编译,可以减少 Android 端内存使用,减小安装包大小,提升执行效率。

2.什么是 JavaScript 引擎?

JavaScript 引擎是一个专门处理 JavaScript 脚本的虚拟机,一般会附带在网页浏览器之中。

3.主流 JavaScript 引擎

V8(Google)、JavaScriptCore(Apple)、SpiderMonkey(Firefox)

4.RN 中的 JavaScript 引擎

Weex,Android:V8,iOS:JavaScriptCore

RN,Android:JavaScriptCore(Hermes、V8),iOS:JavaScriptCore(Apple 要求)

注:Hermes Engine在React-native 0.60.2 版本后支持

5.Hermes 的特色

预编译字节码(引擎加载二进制代码效率高于运行JS脚本)

无 JIT 编译器(减小了引擎大小,优化内存占用,但直接运行 JS 脚本的性能差于 V8 和 JSC)

针对移动端的垃圾回收策略

6.优化原理

截取自code.fb.com

传统 JavaScript 引擎通常是以上图的模式完成代码执行的,编译阶段只完成 babel 转义和 minify 压缩,产物还是 JavaScript 脚本,解释与执行的任务都需要在运行时完成(如 V8 引擎,还会在运行时将 JavaScript 编译为本地机器码)很明显缺点就是在运行时需要边解释边执行,甚至需要占用系统资源执行编译任务。

截取自code.fb.com

Hermes 引擎使用了 aot 编译的方式,将解释和编译过程前置到编译阶段,运行时只完成机器码的执行,大大提高了运行效率。

7.已有项目接入 Hermes

  • 升级 React-Native 及相关库升级(成本较小)

  • 因为 React-Native 0.60.x 变更为依赖 AndroidX,所以 Android 项目需要使用 28 以上版本编译,适配Android 高版本,且需要迁移到 AndroidX(成本较大)

  • 修改 build.gradle,添加 Hermes 相关属性及依赖(成本较小)

8.是否支持 CodePush?

Hermes 引擎预编译后的产物与RN原方式相同,都是在 assets 文件夹下生成的 index.android.bundle 文件。RN 原方式中 index.android.bundle 是经过压缩的 JavaScript 脚本文件,Hermes 预编译后则是二进制文件。因为只有产物文件格式的区别,并没有修改原有JS Bundle 的加载方式,所以 CodePush 可以继续使用。

目前 code-push 的两种发布模式支持情况:

9.调试效率

Debug 模式下 Hermes 不开启预编译以支持 Hot Reload ,缺点是 Release 模式下所有Hermes 引擎优势都不存在,甚至因为无 JIT 导致性能还要差于原有引擎。但开发者模式并不追求性能,而更追求调试效率。

Debug 模式内置 libhermes-inspector.so ,支持 Chrome inspect 的使用,支持 DevTools 协议,比原有 RN 调试体验更佳(应用内代理,不能同步调试原生调用)

10.ES 标准支持

Hermes 支持 ES6,紧跟最新的 JavaScript 规范。为了优化引擎大小,不支持 RN 程序中使用较少的语言特性,如本地 eval()。

11.性能调研

▍包大小分析

JSC 引擎 Release 包


Hermes 引擎 Release 包

原包大小 20MB(JSC)
新包大小 18MB(Hermes)

包大小减小 2MB,整体减少 2MB / 20MB = 10%

分析具体包大小减小的原因可以发现,包内容两者只有 lib 大小和 assets 的大小存在差异。

JSC 引擎 Release 包


Hermes 引擎 Release 包

对比 lib 内容,发现大小差距主要是由 libjsc.so 和 libhermes.so 两者的差距导致的,即 Hermes 引擎的大小。


JSC 引擎 Release 包

Hermes 引擎 Release 包

对比 assets 内容,发现大小变化主要由 index.android.bundle ,即 JavaScript 打包产物引起,Hermes 模式下反而更大的原因是进一步编译为二进制代码。

两者影响叠加导致整体减小,包大小得到优化。(支持的平台越多,包体积优化效果越好)

▍内存分析

实验方法:在相同的业务页面稳定状态下通过 Memory Profiler 查看内存占用情况


JSC 引擎 Release 包


Hermes 引擎 Release 包

原包平均内存占用 210MB
新包平均内存占用 190MB

内存占用平均减小20MB以上,整体减小20MB / 210MB = 10%
分析 Profiler 数据可以发现,内存优化主要发生在 Code 内存区。


JSC 引擎 Release 包


Hermes 引擎 Release 包

Google 官方文档中对内存 Code 区的描述:

Code:您的应用用于处理代码和资源(如 dex 字节码、已优化或已编译的 dex 码、.so 库和字体)的内存。

联系到上个章节中包大小分析中 libhermes.so 尺寸的减小,可以很容易想到,内存占用的减少就是因为 .so 对内存占用的减小。另外两者对 JavaScript 内存的占用也有细微差别,但是可以忽略不计。

▍TTI性能

TTI:Time to Interactive,用户可交互时间,启动到页面渲染完成并且可以正常响应用户的输入的时间,衡量用户体验的移动端指标。

React-Native Android 中主要是 Application onCreate 开始到 RN 组件渲染完成可交互的时间。

值得吐槽的是,在 iOS 版本的 Pref Monitor 中直接就包含了这个指标的显示,但是 Android 版本的 Pref Monitor 只有四个指标,且并没有 TTI 这一指标。

在 Android 平台上可以通过 RN 提供的 ReactFindViewUtil 类获取 RN 组件对应的原生组件,注册对应的渲染回调,在控件渲染完成时记录TTI结束时间。


JSC 引擎 Release 包


Hermes 引擎 Release 包

原包 TTI 829ms
新包 TTI 694ms

TTI 减少 135ms,整体减少 135ms / 829ms = 16%

12.总结

面对 Flutter 的咄咄攻势,React-Native 终于做出了一些改变,Hermes 作为一款适合移动端的 JavaScript 引擎,确实有其性能优势,希望通过本文能够让你更加了解 Hermes。

本文首发自普惠出行产品技术 (ID:pzcxtech)

RN 技术探索:Hermes Engine 初探相关推荐

  1. GitChat · 安全 | 基于机器学习的 Webshell 发现技术探索

    GitChat 作者:兜哥 原文: 基于机器学习的 Webshell 发现技术探索 关注公众号:GitChat 技术杂谈,一本正经的讲技术 第十一章WebShell检测 WebShell就是以ASP. ...

  2. Spark数据挖掘-基于 K 均值聚类的网络流量异常检测(1): 数据探索、模型初探

    Spark数据挖掘-基于 K 均值聚类的网络流量异常检测(1): 数据探索.模型初探 1 前言 分类和回归是强大易学的机器学习技术.需要注意的是:为了对新的样本预测未知的值, 必须从大量已知目标值的样 ...

  3. 从入门到深入:移动平台模型裁剪与优化的技术探索与工程实践

    可以看到,通过机器学习技术,软件或服务的功能和体验得到了质的提升.比如,我们甚至可以通过启发式引擎智能地预测并调节云计算分布式系统的节点压力,以此改善服务的弹性和稳定性,这是多么美妙. 而对移动平台来 ...

  4. 【深度学习】模式识别技术探索之决策树(Decision tree)

    [深度学习]模式识别技术探索之决策树(Decision tree) 文章目录 1 什么是模式和模式识别? 2 常见的模式识别系统 3 应用领域 4 举例:随机森林(Random Forest)4.1 ...

  5. 【深度学习】计算机视觉相关技术探索(一)

    [深度学习]计算机视觉相关技术探索(一) 文章目录 1 计算机视觉概述 2 使用机器学习解决图像分类问题 3 Keras和神经网络简介 4 卷积神经网络(CNN),迁移学习 5 对象检测问题 6 yo ...

  6. 视频通信关键技术探索及实践

    导读:2021年10月21日,「QCon 全球软件开发大会」在上海举办,网易智企技术 VP 陈功作为出品人发起了「AI 时代下的融合通信技术」专场,邀请到多位技术专家与大家一起分享相关技术话题. 我们 ...

  7. 嘉宾PPT分享|泛娱乐领域音视频技术探索与实践

    2021·MCtalk 5G 技术大带宽.低延时.海量连接的特点,让短视频.直播购物.游戏.音视频社交等变得更加简单,同时,互联网的发展带来了泛娱乐领域的多样化体验,让大众对于 AI 以及音视频的体验 ...

  8. 容器编排技术 -- Google Computer Engine入门

    容器编排技术 --  Google Computer Engine入门 下面的例子用4个节点虚拟机和1个主虚拟机(也就是说集群中使用了5个虚拟机)创建了一个Kubernetes集群.您可以在您的工作站 ...

  9. 智能化测试技术探索与实践——AAAS/IEEE Fellow、北京大学讲席教授谢涛阿里行

    谢涛教授简介 谢涛教授长期从事软件工程的研究,在软件测试.软件解析学.软件安全.智能软件工程.教育软件工程等方面做出了很多开创性的工作及突出的研究成果,因此先后当选美国计算机协会杰出科学家(ACM D ...

最新文章

  1. .NET简谈组件程序设计之(AppDomain应用程序域)
  2. 几个软件商店的网址和使用 备忘
  3. c#/.net 循序渐进理解-委托
  4. Android应用开发的一些规则
  5. 三星突然发布Galaxy S10 Lite和Note 10 Lite:有不同也有所同
  6. 计算机应用专业毕业论文总结,计算机技术与应用
  7. BCH升级在即,什么是OP_CHECKDATASIG和Canonical Transaction Ordering(一)
  8. linux安装程序时Cannot uninstall XXX. It is a distutils installed project and thus we cannot accurately
  9. 4.OpenCV视频处理
  10. WixSharp打包软件安装包入门教程
  11. python re提取中文
  12. 搭建美丽天天秒链动2+1OpenRApp开发
  13. DIV+CSS网页设计常用布局代码
  14. web前端HTML和CSS3常见面试题
  15. Linux下安装压力测试工具hey、参数介绍、实例
  16. 【Java】使用Jconsole连接远程云服务器(基于华为云Centos7)
  17. button标签 onclick属性
  18. MOS管的工作原理和区分
  19. 八种求职者最易被面试官拒绝
  20. 关于“远程计算机或设备不接受连接”解决方法

热门文章

  1. 在线CAD看图网页版,一样可以快速查看CAD图纸
  2. 《脱颖而出——成功网店经营之道》一2.6 连横:返利模式的应用及分销
  3. js获取最新的省市区地址
  4. paddleocr训练自己的数据最简单方式软件一键训练
  5. HEVC帧内预测参考像素检测获取和滤波
  6. Centos7 上安装 FastDFS
  7. MBA面试系列之----中文面试宝典(一)
  8. vue 移入显示_vue鼠标移入显示点赞图标,移出隐藏点赞图标,现在我想点击点赞图标,鼠标移出不会隐藏图标,怎么做?...
  9. 学生选课系统业务需求
  10. 清除新版Google Chrome浏览器中表单控件(input,button...)默认的黑色边框