NodeJS 中是否有任何 JIT 预缓存支持?

Art*_*2e5 5 v8 node.js

我使用的是相当大的,性能密集型方案的NodeJS来生成CJK字体提示的数据(sfdhanautohint),以及一些更好的依赖性跟踪我不得不结束了从一个makefile调用程序的NodeJS数万次这样

这立即让我担心这样做实际上会在启动和预热 JIT 引擎时产生大量开销,因此我决定ngen.exe为 nodejs寻找类似的东西。看起来 V8已经对代码缓存有了一些支持,但是我可以做些什么来在 NodeJS 中使用它?

kProduceCodeCache在 NodeJS 的 GitHub 存储库中搜索不会返回任何非捆绑的 v8 结果。也许是时候提出功能请求了……

Nic*_*ele 5

是的,这会自动发生。第一次运行代码时,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,这是一个很小的模块,它将 JIT 你的代码和 require(),并将你的 Node 缓存保存到你的 $TMP 文件夹中,并且如果找到的话就使用它。查看源代码,了解它是如何满足其他需求的。

如果您愿意,您可以在启动时进行一些检查,如果机器架构位于您的缓存文件集中,则只需加载缓存文件,而不是让 Node JIT 处理所有内容。对于具有大量需求的现实大型项目,这可以将您的加载时间减少一半或更多,并且可以在第一次运行时做到这一点

非常适合加速容器并使它们的“微服务”启动时间低于 500 毫秒。

需要注意的是:

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