【发布时间】:2017-06-26 16:56:21
【问题描述】:
Node.js 社区在 Twitter、GitHub 和 Facebook 小组讨论中越来越多地引用“CrankShaftScript”(和“CrankShaftJS”)。我认为 Node.js 是用 C++ 和 JavaScript 编写的,那么 CrankShaftScript 在像这样的性能回归错误中指的是什么:
【问题讨论】:
Node.js 社区在 Twitter、GitHub 和 Facebook 小组讨论中越来越多地引用“CrankShaftScript”(和“CrankShaftJS”)。我认为 Node.js 是用 C++ 和 JavaScript 编写的,那么 CrankShaftScript 在像这样的性能回归错误中指的是什么:
【问题讨论】:
CrankShaftScript 是社区为在 V8 的 CrankShaft 引擎上运行得更快(est?)的 JS 习语(例如某些类型的循环)起的名字。
曲轴被一个名为 TurboFan 的引擎取代。多年来,开发人员编写的许多 JS 代码都是专门为在 CrankShaft 上快速运行而编写的(例如,用“CrankShaftScript”编写),使用在 CrankShaft 上运行速度快的已知习语——这不再一定是这种情况,因为 V8 引擎现在是不同,在 CrankShaft 上运行最快的代码不一定保证在 TurboFan 上运行最快。
如果我的回答过于冗长,下面是 NodeJS Benchmarks 线程上的 great comment,可能会更详细:
...我注意到 Node 核心的某些部分是用 CrankshaftScript,即仔细调整到有效的东西 曲轴非常好。
【讨论】:
CrankShaftScript 是社区采用的术语,用于表示非惯用和/或非标准兼容 JavaScript,仅在使用 CrankShaft JIT 编译器的 v8 JavaScript 运行时的特定版本中执行和/或表现良好。具体示例包括:以难以维护的方式编写的循环以解决 v8 中的 JIT 优化缺陷,以及使用 v8 特定的内置函数/全局变量。
这个术语最初是用来描述 node-chakracore 和 spidernode 中的一些根本性能问题,它们是使用 ChakraCore 和 SpiderMonkey 运行时而不是 v8 的 Node.js 发行版。
它现在被用作解释为什么 Node.js 8.1 发布系列(更新到 v8 的较新版本)由于 v8 的 CrankShaft JIT 被 TurboFan 取代而在微观和宏观基准测试中出现若干性能回归的简写(有时称为“TF”)。在这些问题中:
出于这些原因,Node.js 社区正在积极致力于删除 Node.js 核心代码以及常见 npm 包中的 CrankShaftScript 实例。这应该有助于其他 Node.js 发行版(如 node-chakracore)更好地执行并降低未来升级到 Node.js 中的 JavaScript 运行时的风险。
【讨论】:
try..catch)。 “CrankshaftScript”代码完全符合标准,可以在任何地方运行,它恰好针对 Crankshaft 进行了优化。
CrankShaft 是 V8 的编译基础设施,Node.js 的 Javascript 运行时 (details)。
【讨论】: