当前位置: 首页 > news >正文

Node.js 新计划:使用 V8 snapshot 将启动速度提升 8 倍

昨天 @hashseed 为 Node.js 提交了一个 issue:RFC: speeding up Node.js startup using V8 snapshot#17058

hashseed 是一名 Google 工程师,是 V8 开发者,同时也为 Node.js 贡献代码。在 issue 中 hashseed 写道:

我最近研究了 Node.js 的启动代码,我认为我们可以通过使用 V8 snapshot 让它启动的更快。我写了一个设计文档来解释几个要点。

设计文档:Speeding up Node.js startup using V8 snapshot(Google Doc 需科学上网)


Node.js 核心的大多数代码都是使用 JavaScript 实现的。当应用启动时,Node.js 首先创建 V8::Isolate,其次是 V8::Context,接着才是 node::Environment。然后准备创建 process 对象,以及其它对象,然后运行 bootstrap_node.js 设置运行环境。只有执行完上述所有的任务后,Node.js 才开始运行用户脚本。

所有这一切都会造成启动性能的损失。有一个不严谨的比较:执行 d8 -e "" 代码,D8(V8 的开发版 shell)需要大约 50 毫秒, 而高端工作站的 Node.js,执行 node -e "" 却需要 400 毫秒。

V8 的启动快照(startup snapshot)是可以提升创建 V8 isolate 和 V8 contexts 的效率。它由两个部分组成:isolate 快照和 context 快照。

而 V8 启动快照 也不是什么新鲜玩意,早在 2015 年就已经被 V8 采用。相关博文:Custom startup snapshots(需科学上网)。

简而言之,使用快照就不需要再从头开始建立 isolate,V8 可以简单地把之前序列化的 isolate 对象图进行反序列化就可以了。这同样适用于 context 快照。这样一来,V8 能够显著加快启动。

Node.js 也得益于创建一个新的 isolate 和新的 context。然而,启动过程中的后续步骤并不是快照的一部分,因此导致明显的开销。如果我们能创建 Node.js 已全面启动的快照,但此时还没有开始执行任何用户脚本,那么我们就可以减少启动时间。简单做一下评估,大概可以高达 8 倍。


hashseed 在 《Speeding up Node.js startup using V8 snapshot》简单描述了大概的实施细节,包括启动和执行相分离、原生绑定、创建快照的时机、等等…… hashseed 表示这是一个 side project,他将花费很长时间才能取得进展。

今年 4 月份,GitHub 已经使用了 V8 startup snapshot 技术来提升 Atom 的启动速度,Improving Startup Time

Bootstrap Node

V8 还可以更快,Node.js 还可以更快,JavaScript 还可以更快,…… 拭目以待吧


欢迎关注我的公众号,回复 V8 可查看我的 V8 专题:

justjavac微信公众号

相关文章:

  • Linux系统查看系统是32位还是64位方法总结【转】
  • 扩展Label控件(1) - 实现回发(Postback)功能
  • 使用 Github Pages 发布你的项目文档
  • 解决客户一例:使用域超级管理员打开Exchange 2010发现没有权限
  • AngualrJs 微信支付url未注册大坑解决方法
  • mac终端下svn常用命令
  • http协议进阶(四)报文首部
  • QName
  • 浅议tomcat与classloader
  • Java中的匿名内部类
  • 移动端点击作弊与激活作弊的现象与预警
  • IT人员的职业生涯规划
  • 电话号码校验
  • /var/spool/postfix/maildrop 下有大量文件
  • kubernetes test-infra
  • Java,console输出实时的转向GUI textbox
  • JS 面试题总结
  • leetcode378. Kth Smallest Element in a Sorted Matrix
  • LeetCode541. Reverse String II -- 按步长反转字符串
  • Promise初体验
  • Python进阶细节
  • Stream流与Lambda表达式(三) 静态工厂类Collectors
  • Theano - 导数
  • 初探 Vue 生命周期和钩子函数
  • 小而合理的前端理论:rscss和rsjs
  • 一些css基础学习笔记
  • 用element的upload组件实现多图片上传和压缩
  • 用简单代码看卷积组块发展
  • 机器人开始自主学习,是人类福祉,还是定时炸弹? ...
  • ​DB-Engines 11月数据库排名:PostgreSQL坐稳同期涨幅榜冠军宝座
  • ​软考-高级-系统架构设计师教程(清华第2版)【第12章 信息系统架构设计理论与实践(P420~465)-思维导图】​
  • #pragma 指令
  • #微信小程序:微信小程序常见的配置传值
  • (c语言)strcpy函数用法
  • (ZT)北大教授朱青生给学生的一封信:大学,更是一个科学的保证
  • (zz)子曾经曰过:先有司,赦小过,举贤才
  • (补)B+树一些思想
  • (第27天)Oracle 数据泵转换分区表
  • (翻译)Entity Framework技巧系列之七 - Tip 26 – 28
  • (附源码)springboot码头作业管理系统 毕业设计 341654
  • (附源码)计算机毕业设计ssm本地美食推荐平台
  • (七)微服务分布式云架构spring cloud - common-service 项目构建过程
  • (十八)用JAVA编写MP3解码器——迷你播放器
  • (原创)攻击方式学习之(4) - 拒绝服务(DOS/DDOS/DRDOS)
  • (转)Google的Objective-C编码规范
  • (转)JVM内存分配 -Xms128m -Xmx512m -XX:PermSize=128m -XX:MaxPermSize=512m
  • (转)树状数组
  • .net 怎么循环得到数组里的值_关于js数组
  • /bin/bash^M: bad interpreter: No such file ordirectory
  • [1204 寻找子串位置] 解题报告
  • [3D游戏开发实践] Cocos Cyberpunk 源码解读-高中低端机性能适配策略
  • [AIGC] SQL中的数据添加和操作:数据类型介绍
  • [ai笔记4] 将AI工具场景化,应用于生活和工作
  • [AutoSar]BSW_Memory_Stack_003 NVM与APP的显式和隐式同步
  • [BZOJ5250][九省联考2018]秘密袭击(DP)