NodeJS 是否支持 JIT 预缓存?

Is there any JIT pre-caching support in NodeJS?

我正在使用一个相当大且性能密集型的 nodejs 程序来为 CJK 字体生成提示数据 (sfdhanautohint),为了更好地跟踪依赖关系,我最终不得不从生成文件 like this.

这立即让我担心这样做实际上会在启动和预热 JIT 引擎时产生大量开销,因此我决定为 nodejs 找到类似 ngen.exe 的东西。看起来是 V8 already has some support for code caching,但是我可以做些什么来在 NodeJS 中使用它吗?

正在搜索 kProduceCodeCache in NodeJS's GitHub repo doesn't return any non-bundled-v8 results. Perhaps it's time for a feature request

是的,这是自动发生的。 Node 5.7.0+ 会在您第一次 运行 您的代码时自动预缓存(为您的源预热 JIT 引擎)(自 PR #4845 / 2016 年 1 月此处:https://github.com/nodejs/node/pull/4845)。

重要的是要注意你甚至可以预热预热(在你的代码甚至 运行 在机器上之前,你可以预缓存你的代码并告诉 Node 加载它)。

Andres Suarez,一位从事 Yarn、Atom 和 Babel 工作的 Facebook 开发人员创建了 v8-compile-cache,这是一个很小的模块,可以对您的代码和 require() 进行 JIT,并将您的 Node 缓存保存到您的$TMP 文件夹,如果找到则使用它。查看来源,了解它是如何满足其他需求的。

如果您愿意,您可以在启动时稍微检查一下 运行s,如果机器架构在您的缓存文件集中,只需加载缓存文件而不是让 Node JIT 一切。对于具有大量需求的真实世界大型项目,这可以将您的加载时间减少一半或更多,并且它可以在第一个 运行

非常适合加速容器并使它们低于 500 毫秒 "microservice" 启动时间。

重要提示:

  1. 缓存是二进制的;它们包含机器可执行代码。它们不是您的原始 JS 代码。
  2. 您打算 运行 在(IA-32、IA-64、ARM 等)上 CPU 的每个目标的节点缓存二进制文件都不同。如果你想为你的用户预缓存pre-caches,你必须为你想要支持的每个目标架构制作缓存目标。
  3. 享受惊人的速度提升:)