写点什么

Facebook 开源 JavaScript 引擎 Hermes:显著降低启动时间和内存使用

  • 2019-09-01
  • 本文字数:1136 字

    阅读完需:约 4 分钟

Facebook 开源 JavaScript引擎Hermes:显著降低启动时间和内存使用

近日,Facebook开源了 JavaScript 引擎 Hermes,该引擎旨在提高React Native App在Android设备上的性能,尤其是启动性能、安装文件大小和内存消耗。微软 Office 和Mattermost(Slack 的一个开源替代品)的初步基准测试都证实了这一点。


Hermes 源于 Facebook 内部一个提高自身移动应用性能的项目。工程师们注意到其中一个关键因素是 JavaScript 引擎本身,所以他们决定针对移动应用受限的环境对引擎进行优化


在探索了其他选项后,我们构建了一个全新的 JavaScript 引擎 Hermes。它旨在提高应用程序的性能,专注于提高 React Native App 性能,尤其是那些部署在内存有限、存储缓慢、计算能力下降的大众市场设备上的应用。


如上所述,Hermes 关注于三个指标:应用程序从启动到可用所需的时间(首次交互时间,缩称 TTI)、应用安装文件大小(APK 大小)和内存利用率。Facebook 介绍了他们为改进这些指标所做的三个主要架构决定:预编译 JavaScript 源代码,抛弃 JIT 编译器以及改进垃圾收集策略以适应移动操作系统的限制。


将 JavaScript 预编译成字节码对性能有两个关键的好处。一方面,前向解析和直接编译减少了启动时间。另一方面,由于预编译阶段对时间限制要求更小,通常生成的字节码也更小、更有效,编译器可以对程序整体进行优化,如函数重复数据删除和字符串表打包等。在字节码格式的前端,Hermes 字节码可以映射到内存中,而不需要提前读取整个文件,这对于使用缓慢闪存的情况尤其有效,并减少了应用由于过度使用内存而被操作系统杀死的情形。



此外,Facebook 还维护了一个对 CPU 密集型工作负载进行了优化的 JIT 编译器,而这些工作负载并不是典型的移动应用程序。但是,同之前的优化相比(缩短 TTL 时间,减小本机代码大小和内存消耗),不使用该 JIT 编译器也不会产生很大的影响, 作为移动应用程序的最终性能优化,Hermes 使用了垃圾内存收集策略,旨在最小化应用程序由于内存使用而被移动操作系统杀死的几率。Hermes 垃圾收集器试图减少总体虚拟内存的消耗,为此实现了非连续块内存的按需分配,在不再需要时,这些内存可被移动和返回给操作系统。


如上所述,Facebook 和微软的初始基准测试在所有三个指标上都显示出了显著的增长。特别是,Slack 的替代品 Mattermost 将其 TTL 时间以及其应用程序大小减半,整体内存利用率下降了 25%。微软Office在所有指标上也提高了20-25%的性能



Facebook 并没有将其新的 JavaScript 引擎定位为 V8 的替代品,他们仍然认为 V8 最适合 Node 和基于浏览器的应用程序。值得注意的是,iOS 应用程序只能使用 iOS 开发包中包含的 JavaScript 引擎,因此它们无法从 Hermes 的优化中获益。


原文链接:


Facebook Hermes May Significantly Reduce Boot-time and Memory Usage in Android React Native Apps


2019-09-01 08:006439
用户头像

发布了 36 篇内容, 共 19.4 次阅读, 收获喜欢 55 次。

关注

评论 2 条评论

发布
用户头像
React Native 是一个框架名,不应该译为 "React 原生"
2019-09-02 09:50
回复
感谢反馈,已经修改。
2019-09-02 10:03
回复
没有更多了
发现更多内容

linux常用命令

乌龟哥哥

6月月更

A16Z : Web3生态全景概览

Dream

Web3.0

周末来学集合论

坚果

6月月更

DOM核心——Document类型

大熊G

JavaScript 前端 6月月更

Linux开发_网络编程基础(1)

DS小龙哥

6月月更

作为神经搜索生态的开创者,Jina AI 在做什么?

Jina AI

Python 深度学习 开源 云原生 搜索

读书笔记之:你当象鸟飞往你的山

甜甜的白桃

读书笔记 读书 笔记 6月月更

SDN系统方法 | 8. 网络虚拟化

俞凡

架构 网络 sdn SDN系统方法

InfoQ 极客传媒 15 周年庆征文|Vim 常用快捷键

耳东@Erdong

vim 运维 快捷键 6月月更 InfoQ极客传媒15周年庆

【Spring 学习笔记(十三)】Spring AOP 五大通知类型

倔强的牛角

Java spring spring aop 6月月更

spring4.1.8扩展实战之八:Import注解

程序员欣宸

Java spring Spring Framework 6月月更

☕️Java11 中基于嵌套关系的访问控制优化

看山

Java Java11

Switch 块、Switch 表达式、Switch 模式匹配,越来越好用的 Switch

看山

Java Switch

有爱无碍,科技为他们点亮漫天星光

脑极体

硬核干货:6000字 30张图,带你彻底搞懂BGP动态路由!

wljslmz

BGP 网络技术 动态路由 6月月更

华为云图引擎服务

程思扬

华为 华为云 云开发

leetcode 64. Minimum Path Sum 最小路径和(中等)

okokabcd

LeetCode 动态规划 数据结构与算法

BOM

Jason199

js BOM 6月月更

市场冷空气来袭,SeekTiger如何逆流而上?

股市老人

连续居家办公68天后——我的2022居家办公所感所想| 社区征文

No Silver Bullet

居家办公 6月月更 初夏征文 心得体会

如何为 SAP 电商云每个不同的 JavaScript Storefront 分别配置 API endpoint

汪子熙

SAP Hybris commerce 电商云 6月月更

2022 年 Java 行业分析报告

看山

Java 行业报告

Android MediaPlayer音频播放器详解

yechaoa

android 6月月更 MediaPlayer

如何利用 RPA 实现自动化获客?

程序员泥瓦匠

RPA

【愚公系列】2022年06月 通用职责分配原则(七)-纯虚构原则

愚公搬代码

6月月更

流数据操作

Damon

6月月更

GNU/Linux知识库(2)- 安装和文件系统

冯亮

Linux DevOps GNU

Apipost=Postman+Swagger+Mock+流程测试?

Xd

Java 后端 接口测试

C#入门系列(十九) -- 作用域、生命期和析构函数

陈言必行

C# 6月月更

Vue-14-列表渲染v-for

Python研究所

6月月更

千万级学生管理系统考卷模块存储架构设计

泋清

#架构训练营

Facebook 开源 JavaScript引擎Hermes:显著降低启动时间和内存使用_大前端_Sergio De Simone_InfoQ精选文章