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

时间:2016-01-19 17:45:23

标签: node.js v8

我正在使用一个相当大且性能密集的nodejs程序来为CJK字体生成提示数据(sfdhanautohint),为了更好的依赖性跟踪,我不得不最终从makefile调用nodejs程序数万次{ {3}}

这让我立即担心这样做实际上会在启动和预热JIT引擎时投入大量开销,因此我决定为nodejs找到类似ngen.exe的内容。它似乎是V8 like this,但在NodeJS中有什么我可以做的吗?

搜索already has some support for code caching不会返回任何非捆绑的v8结果。也许现在是kProduceCodeCache in NodeJS's GitHub repo ...

的时候了

1 个答案:

答案 0 :(得分:1)

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

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

Facebook开发人员Andres Suarez从事Yarn,Atom和Babel的工作,创建了v8-compile-cache,这是一个很小的小模块,它将使您的代码和require()准时化,并将Node缓存保存到$ TMP中文件夹,然后使用它(如果找到)。查阅源代码,了解如何完成此工作以满足其他需求。

如果愿意,您可以在启动时进行一点检查,并且如果计算机体系结构在您的缓存文件集中,则只需加载缓存的文件,而不是让Node JIT一切。对于一个有大量需求的真实大型项目,这可以将您的加载时间减少一半或更多,并且可以在第一次运行时完成它。

对于加速容器并使它们在500毫秒的“微服务”启动时间下有效。

请务必注意:

  1. 缓存是二进制文件;它们包含机器可执行代码。它们不是您的原始JS代码。
  2. 节点缓存二进制文件对于要在其上运行的每个目标CPU(IA-32,IA-64,ARM等)是不同的。如果要为用户预缓存预缓存,则必须为要支持的每种目标体系结构设置缓存目标。
  3. 享受可笑的速度提升:)