当前位置: 首页 > 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
  • JS 中的深拷贝与浅拷贝
  • 2018天猫双11|这就是阿里云!不止有新技术,更有温暖的社会力量
  • ECS应用管理最佳实践
  • Git初体验
  • iOS仿今日头条、壁纸应用、筛选分类、三方微博、颜色填充等源码
  • macOS 中 shell 创建文件夹及文件并 VS Code 打开
  • Quartz初级教程
  • 翻译--Thinking in React
  • 基于组件的设计工作流与界面抽象
  • 前端相关框架总和
  • 如何打造100亿SDK累计覆盖量的大数据系统
  • 如何利用MongoDB打造TOP榜小程序
  • 三栏布局总结
  • 腾讯视频格式如何转换成mp4 将下载的qlv文件转换成mp4的方法
  • 突破自己的技术思维
  • 我的业余项目总结
  • 怎么把视频里的音乐提取出来
  • 中文输入法与React文本输入框的问题与解决方案
  • ​Python 3 新特性:类型注解
  • ​猴子吃桃问题:每天都吃了前一天剩下的一半多一个。
  • (12)Linux 常见的三种进程状态
  • (2)nginx 安装、启停
  • (4)logging(日志模块)
  • (javascript)再说document.body.scrollTop的使用问题
  • (附源码)ssm户外用品商城 毕业设计 112346
  • (学习日记)2024.03.25:UCOSIII第二十二节:系统启动流程详解
  • (终章)[图像识别]13.OpenCV案例 自定义训练集分类器物体检测
  • (转)GCC在C语言中内嵌汇编 asm __volatile__
  • (转)Linq学习笔记
  • .NET/C# 使用反射调用含 ref 或 out 参数的方法
  • .NET的数据绑定
  • .net图片验证码生成、点击刷新及验证输入是否正确
  • @ 代码随想录算法训练营第8周(C语言)|Day57(动态规划)
  • @angular/cli项目构建--http(2)
  • @FeignClient注解,fallback和fallbackFactory
  • @WebServiceClient注解,wsdlLocation 可配置
  • [ vulhub漏洞复现篇 ] Celery <4.0 Redis未授权访问+Pickle反序列化利用
  • [1]-基于图搜索的路径规划基础
  • [4.9福建四校联考]
  • [Android]一个简单使用Handler做Timer的例子