为您的 Node 性能选择最佳的 JS 引擎
发布于 3 天前 作者 justjavac 523 次浏览 来自 分享

本文翻译自 Picking the best JS engine for your Node app’s performance,中文版首发在我的知乎专栏 V8 源码及周边

tl;dr

Node.js 正在飞速的发展。目前 Node.js 8 已经发布。同时,基于 ChakraCore 的 Node.js 版本也正在积极开发中。

原文是:The recent Node.js v8 version (not to be mistaken with V8, the JavaScript engine) has just been published.

原作者使用了 Node.js v8 version 这个词,为此作者专门在括号中解释了这里的 V8 不是 javascript 引擎 V8,而是 Node.js 的版本。但是在 Node.js 官方博文 Node v8.0.0 (Current) 中有一段注释:

Note that, when referring to Node.js release versions, we have dropped the “v” in Node.js 8. Previous versions were commonly referred to as v0.10, v0.12, v4, v6, etc. In order to avoid confusion with V8, the underlying JavaScript engine, we’ve dropped the “v” and call it Node.js 8.

请注意,当引用 Node.js 发布版本时,我们已经在 Node.js 8 中删除了 “v”。以前的版本通常被称为 v0.10,v0.12,v4,v6 等。为了避免与 V8 JavaScript 引擎混淆,我们放弃了 “v” 并将其称为 Node.js 8。 所以,Node.js v8 版本应该直接称为 Node.js 8。

由于 Node.js 使用的 JavaScript引擎不知道什么时候会引入新功能,开发者们都像明确的知道不同引擎在性能方面的性能优劣。

我们对以下几个 Node.js 版本做了性能评估:

  • Node.js 6.10.1 (V8 5.1.281.95)* Node.js 7.10 (V8 5.5.372.43)
  • Node.js 7.10 使用 --turbo --ignition 参数 (V8 5.5.372.43)
  • Node.js 8.0 (V8 5.8.283.41)
  • Node.js 8.0 使用 --turbo --ignition 参数 (V8 5.8.283.41)
  • Node.js 8.0 (ChaKraCore 2.0.0.0) (使用 2 种不同的构建版本)

你可以通过这个简单的 可视化工具 查看不同版本对于不同特性的性能。

在这些结果中,如果你使用的是 Node.js 8,你还可以查看开启 --turbo --ignition 参数后的 javascript 性能。

Context

虽然 V8 是 Node.js 使用的默认 JavaScript 引擎,但是 Node.js 提供了一个通用的平台,允许开发者选择不同的 JavaScript 引擎。

Node.js 8 的发布非常令人兴奋,并且是社区内的一件大事。该平台已附带一套全新功能。此外,开发者最关注的就是性能。

了解哪种 JavaScript 引擎最适合运行应用程序将成为一项非常有用的技能。 在本文中,我们将看到 V8 和 ChakraCore 的不同版本在性能方面的优劣。

方式

要比较不同 Node.js 版本之间的基准测试,我选择了有代表意义的 35 种 JavaScript 代码模式。他们中的大多数都是从 Colin Ihrig’s ‘will it optimize’ 的 repo 中获取的。这些模式已经在前面的文章(Optimize your Node app by simply upgrading Node.js)中讨论过了。

对于每个模式,分别使用了每个不同版本的 Node.js 运行 10 次、100 次、1000 次、10000次和 10000 次。 通过允许这些代码,我们呢可以了解每个引擎如何进行运行时常规优化和热函数(hot function)优化。

基准测试没有考虑垃圾收集(GC)事件的数量。 这意味着如果修改分配给每个进程的内存,则实验的结果可能会不同。

结果

V8 justjavac

这个页面 可以查看完整的测试结果。通过分析这个结果,我们可以发现 ChakraCore 的 Node.js 版本比基于 V8 的版本慢。

此外,在大多数情况下,随着时间的迁移 V8 变得越来越高效。Ignition 和 Turbofan 优化架构很显著地提升了性能。 Node.js 8 随 V8 5.8 发布,但是 默认并没有启用。 Node.js 的未来版本将随着启用了 Ignition 和 Turbofan 的 V8 5.9(也可能是 5.6)一起提供。

结论

这个基准测试非常有趣,我计划在将来增加更多的 Node.js 版本和更多的代码模式。作为Sqreen 的 Node.js 工程师,我非常关心性能。

(译注:后面还有 4 端内容,大部分都是原作者的广告,就不翻译了)

最后推荐作者开发的这个强大的性能可视化对比工具:Picking the best JS engine for your Node app’s performance 还有我的讲座:前端程序员应该懂点 V8 知识

EOF

6 回复

只看懂了最后两句😂😂

来自酷炫的 CNodeMD

对我学习node有点点帮助!

Ignition就是解释执行字节码的引擎,在大多数函数只执行一遍的情况下会节约很多时间,但肯定跑分不会好看 turbofan就是字节码到机器码的编译器

@kyriosli 如果遇到经常去优化(deopt)的场景,Ignition 还是不错的。

我不听 我不听 我就选fibjs 时刻使用最新的v8(哈哈哈

回到顶部