写点什么

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:006608
用户头像

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

关注

评论 2 条评论

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

Flutter的原理及美团的实践(中)

android 程序员 移动开发

Flutter绘制-11-旋转小人儿造成的视觉错效

android 程序员 移动开发

git 补丁 - diff 和 patch 使用详解(1)

android 程序员 移动开发

Flutter33

android 程序员 移动开发

Flutter开发中的一些Tips(二)

android 程序员 移动开发

Fragment极度懒加载-+-Layout子线程预加载,奇妙的APP启动速度优化思路

android 程序员 移动开发

Flutter动画:用Flutter来实现一个拍手动画

android 程序员 移动开发

Flutter实战1 --- 写一个天气查询的APP

android 程序员 移动开发

Flutter开发之——Menu

android 程序员 移动开发

Flutter开发之——运行卡在gradle assembleDebug

android 程序员 移动开发

Fragment add与replace的区别(1)(1)

android 程序员 移动开发

Flutter40

android 程序员 移动开发

Flutter填坑全面总结(包括Flutter1

android 程序员 移动开发

Flutter如何实现下拉刷新和上拉加载更多

android 程序员 移动开发

Flutter与Dart-入门

android 程序员 移动开发

Flutter集成高德定位和地图功能

android 程序员 移动开发

Github标星3-2K-2020BATJ数据结构与算法笔试题及其答案吐血整理!

android 程序员 移动开发

Flutter教程(二) 了解Dart语言

android 程序员 移动开发

Flutter版-WanAndroid-App

android 程序员 移动开发

Flutter状态管理--Getx学习2

android 程序员 移动开发

Flutter:基于video_player实现视频相关手势控制、全屏播放

android 程序员 移动开发

Flutter32

android 程序员 移动开发

Flutter_bloc框架使用笔记,后续估计都不太会用了(1)

android 程序员 移动开发

Fragment的使用

android 程序员 移动开发

GC 回收机制与分代回收策略

android 程序员 移动开发

Flutter40(1)

android 程序员 移动开发

Flutter_bloc框架使用笔记,后续估计都不太会用了

android 程序员 移动开发

Flutter如何实现下拉刷新和上拉加载更多(1)

android 程序员 移动开发

Flutter开发之——事件监听

android 程序员 移动开发

Github TOP100 Android开源

android 程序员 移动开发

Glide的简单封装GlideUtils

android 程序员 移动开发

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