我的编程空间,编程开发者的网络收藏夹
学习永远不晚

RN 技术探索:Hermes Engine 初探

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

RN 技术探索:Hermes Engine 初探

RN 技术探索:Hermes Engine 初探

桔妹导读:自从 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.优化原理
RN 技术探索:Hermes Engine 初探截取自code.fb.com
传统 JavaScript 引擎通常是以上图的模式完成代码执行的,编译阶段只完成 babel 转义和 minify 压缩,产物还是 JavaScript 脚本,解释与执行的任务都需要在运行时完成(如 V8 引擎,还会在运行时将 JavaScript 编译为本地机器码)很明显缺点就是在运行时需要边解释边执行,甚至需要占用系统资源执行编译任务。
RN 技术探索:Hermes Engine 初探
截取自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 的两种发布模式支持情况:
发布方式是否支持备注
code-push release-react
支持,但无法产生预编译脚本产物
需依赖react-native bundle命令完成脚本打包,该命令尚不支持预编译
code-push release
支持

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

Debug 模式内置 libhermes-inspector.so ,支持 Chrome inspect 的使用,支持 DevTools 协议,比原有 RN 调试体验更佳(应用内代理,不能同步调试原生调用)
10.ES 标准支持
Hermes 支持 ES6,紧跟最新的 JavaScript 规范。为了优化引擎大小,不支持 RN 程序中使用较少的语言特性,如本地 eval()。
11.性能调研

▍包大小分析

RN 技术探索:Hermes Engine 初探
JSC 引擎 Release 包
RN 技术探索:Hermes Engine 初探
Hermes 引擎 Release 包
原包大小 20MB(JSC)
新包大小 18MB(Hermes)
包大小减小 2MB,整体减少 2MB / 20MB = 10%
分析具体包大小减小的原因可以发现,包内容两者只有 lib 大小和 assets 的大小存在差异。
RN 技术探索:Hermes Engine 初探
JSC 引擎 Release 包
RN 技术探索:Hermes Engine 初探
Hermes 引擎 Release 包
对比 lib 内容,发现大小差距主要是由 libjsc.so 和 libhermes.so 两者的差距导致的,即 Hermes 引擎的大小。
RN 技术探索:Hermes Engine 初探
JSC 引擎 Release 包
RN 技术探索:Hermes Engine 初探
Hermes 引擎 Release 包
对比 assets 内容,发现大小变化主要由 index.android.bundle ,即 JavaScript 打包产物引起,Hermes 模式下反而更大的原因是进一步编译为二进制代码。
两者影响叠加导致整体减小,包大小得到优化。(支持的平台越多,包体积优化效果越好)

▍内存分析

实验方法:在相同的业务页面稳定状态下通过 Memory Profiler 查看内存占用情况
RN 技术探索:Hermes Engine 初探
JSC 引擎 Release 包
RN 技术探索:Hermes Engine 初探
Hermes 引擎 Release 包
原包平均内存占用 210MB
新包平均内存占用 190MB
内存占用平均减小20MB以上,整体减小20MB / 210MB = 10%
分析 Profiler 数据可以发现,内存优化主要发生在 Code 内存区。
RN 技术探索:Hermes Engine 初探
JSC 引擎 Release 包
RN 技术探索:Hermes Engine 初探
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结束时间。

RN 技术探索:Hermes Engine 初探
JSC 引擎 Release 包

RN 技术探索:Hermes Engine 初探
Hermes 引擎 Release 包
原包 TTI 829ms
新包 TTI 694ms
TTI 减少 135ms,整体减少 135ms / 829ms = 16%
12.总结
面对 Flutter 的咄咄攻势,React-Native 终于做出了一些改变,Hermes 作为一款适合移动端的 JavaScript 引擎,确实有其性能优势,希望通过本文能够让你更加了解 Hermes。
本文首发自普惠出行产品技术 (ID:pzcxtech)
本文作者
RN 技术探索:Hermes Engine 初探
王李坤
滴滴 | 高级软件开发工程师    哲学程序员,是个气管炎、伪学霸,主要研究移动端技术,目前负责终端技术的落地。相信“技术能够改变世界”,喜欢学习新技术

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

RN 技术探索:Hermes Engine 初探

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

RN 技术探索:Hermes Engine 初探

桔妹导读:自从 Google 的 Flutter 发布之后,Facebook 对 React-Native 的迭代开始快了起来,优化 React-Native 的性能表现,避免被 Flutter 比下去。最近一个比较大的动作是开源了一个 J
2023-06-03

技术分享 | MySQL Test 初探

作者:雷霞爱可生测试团队负责人,专注于 MySQL 相关的测试工作。​本文来源:原创投稿*爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。什么是 Mysql Test?Mysql Test 是 MySQL 发行版本中集成 all-i
技术分享 | MySQL Test 初探
2014-06-10

探索肇庆Go语言技术社区

肇庆是一座历史悠久、文化繁荣的城市,自古就是岭南重镇,素有“碉楼之都”、“鹤鸣之乡”的美誉。如今,随着信息技术的发展,肇庆也在逐渐崛起成为一个充满活力的科技新城。在这肇庆这座城市,随着Go语言的流行,出现了一个充满活力的Go语言技术社区,让
探索肇庆Go语言技术社区
2024-02-28

「SAP技术」SAP MM MPN物料的采购初探

「SAP技术」SAP MM MPN物料的采购初探1, MPN物料号与我方正常使用料号物料主数据之间的LINK关系维护MPN料号14000005, 我方料号11000250, 2,采购信息记录的维护我方物料的PIR, MPN料号的PIR, 3
2023-06-05

PHP 自动加载的艺术:探索加载技术

PHP 自动加载的艺术:深入了解加载技术
PHP 自动加载的艺术:探索加载技术
2024-03-02

Nuxt.js 部署的未来:探索前沿技术

Nuxt.js 部署的未来:释放 Web 应用程序的无限潜力
Nuxt.js 部署的未来:探索前沿技术
2024-03-06

HTML语法的未来:探索新兴技术

HTML语法的未来正在不断演变,不断引入新兴技术以提高网站开发的效率、可访问性和用户体验。本文探讨了这些技术,例如WebAssembly、CSS变量、Flexbox和Grid布局,以及它们如何影响HTML语法。
HTML语法的未来:探索新兴技术
2024-03-09

探索PHP数组反转的各种技术

反转 php 数组的方法有多种:使用 array_reverse() 函数、for 循环或 array_reduce() 函数。array_reverse() 函数快速简单,for 循环提供更精细的控制,而 array_reduce() 函
探索PHP数组反转的各种技术
2024-04-28

Ruby与Linux容器化技术结合探索

Ruby 是一种动态、面向对象的编程语言,广泛应用于 Web 开发、自动化任务等各种场景Docker:Docker 是一种开源的容器化平台,它允许开发人员将应用程序及其依赖项打包到一个轻量级、可移植的容器中。Ruby 应用程序可以很容易地部
Ruby与Linux容器化技术结合探索
2024-09-10

技术分享 | 企业版监控工具 MEM 初探

作者:姚远专注于 Oracle、MySQL 数据库多年,Oracle 10G 和 12C OCM,MySQL 5.6 ,5.7,8.0 OCP。现在鼎甲科技任顾问,为同事和客户提高数据库培训和技术支持服务。本文来源:原创投稿*爱可生开源社区出品,原创内容未经授
技术分享 | 企业版监控工具 MEM 初探
2019-12-25

Golang技术探索:深入了解语言特性

Golang技术探索:深入了解语言特性,需要具体代码示例Golang作为一种开源编程语言,以其高效、简洁和易用的特性被广泛应用于各种领域,尤其在网络编程、云计算和大数据处理领域备受青睐。本文将深入探讨Golang语言的一些特性,结合具体代
Golang技术探索:深入了解语言特性
2024-03-05

探索工程技术管理软件的潜力

工程技术管理软件是一种能够帮助工程师和项目管理者提高工作效率和减少错误的软件工具。它们通过提供各种功能,如项目管理、设计、分析、报告和协作等,帮助用户更好地管理工程项目。工程技术管理软件的发展趋势随着科技的不断进步,工程技术管理软件也在不断发展和创新。以下是一些当前工程技术管理软件的发展趋势:高级数据分析:现代工
探索工程技术管理软件的潜力
2023-12-09

Golang技术在区块链跨链技术中的作用与探索

golang 在区块链跨链技术中扮演着重要角色,主要用于以下方面:跨链协议开发跨链网关创建跨链应用部署Golang 在区块链跨链技术中的作用与探索引言跨链技术是区块链行业的关键发展领域,它允许不同区块链之间进行通信和交互。Go 语言(G
Golang技术在区块链跨链技术中的作用与探索
2024-05-10

Java XML 处理的未来:探索最新技术

Java XML 处理的未来正处于不断发展之中,XML 处理技术持续进化,引入新的工具和技术来简化 XML 操作。本文将探讨 Java 中 XML 处理的最新技术,展示如何利用这些技术有效地处理 XML 数据,进而提高应用程序的性能和灵活性。
Java XML 处理的未来:探索最新技术
2024-03-07

探索canvas JS技术在创意上的突破

突破创意瓶颈:canvas JS的技术应用探索引言:随着科技的不断发展,互联网的普及和应用场景的多样化,人们对于网页设计、游戏开发等领域的需求也越来越高。而作为一种强大且灵活的绘图工具,Canvas JS在满足用户需求方面发挥了重要的作用
探索canvas JS技术在创意上的突破
2024-01-17

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录