昨天@hashseed提交了Node.js的issue:RFC:speedingupNode.jsstartupusingV8snapshot#17058V8开发者,也贡献了代码给节点.js。Hashseed在issue中写道:最近在研究Node.js的启动代码,觉得可以通过V8snapshot让它启动的更快。我写了一个设计文档来解释几个点。设计文档:使用V8快照加速Node.js启动(GoogleDoc需要科学上网)Node.js的核心代码大部分是使用JavaScript实现的。当应用程序启动时,Node.js首先创建V8::Isolate,然后是V8::Context,最后是node::Environment。然后准备创建进程对象等对象,然后运行bootstrap_node.js搭建运行环境。只有在执行完上述所有任务后,Node.js才会开始运行用户脚本。所有这些都会导致引导性能下降。这是一个粗略的比较:D8(V8的开发shell)执行d8-e""代码大约需要50毫秒,而高端工作站上的Node.js需要node-e""400毫秒。V8的启动快照可以提高创建V8isolate和V8context的效率。它由两部分组成:隔离快照和上下文快照。V8启动快照并不是什么新鲜事,早在2015年就被V8采用了。相关博文:自定义启动快照(需要科学上网)。总之,使用快照不需要从头创建一个isolate,V8可以简单的反序列化之前序列化的isolate对象图。这同样适用于上下文快照。这使得V8发动机的启动速度明显加快。Node.js还受益于创建新的隔离和新的上下文。但是,启动过程中的后续步骤不是快照的一部分,因此会产生大量开销。如果我们可以创建Node.js完全启动的快照,但在任何用户脚本开始执行之前,那么我们可以减少启动时间。一次简单的评价可以高达8次。hashseed在《Speeding up Node.js startup using V8 snapshot》中简单描述了大概的实现细节,包括启动和执行的分离、native绑定、创建快照的时机等等。hashseed说这是一个sideproject,需要很长时间才能有进展.今年4月,GitHub已经使用V8启动快照技术来提高Atom的启动速度。改进启动时间V8可以更快,Node.,回复V8查看我的V8话题:
