为了提供一些背景信息,我有兴趣了解如何优化在 Google Cloud Function 上运行的 Node.js Express 应用程序的冷启动时间。
到目前为止,我了解到冷启动的最大惩罚是使用 require 语句加载依赖项。作为一名软件工程师,科学思维告诉我,它将基于文件数量、文件大小、依赖项数量、缓存。然而,也许优化更多的是一门艺术而不是科学,因此我们非常感谢您根据自己的经验提供的任何指示或反馈。
我的问题是
如果我包围
const x = require('x')
有两个process.hrtime()
语句并测量时间差,我将测量“x”的整个包加载时间的加载时间吗?如果是这样,这是否包括加载此包中的所有文件?该包所需的依赖项如何 - 它们何时加载(这引出了我的第三个问题 3)。
如果 require 语句位于条件 block 内,例如
if (condition) { const x = require('x'); }
,它在什么时候“加载”以及“加载”的真正含义是什么(即在内存中、已解析、已执行等)?它会在运行时“加载”语句到达(或不到达),还是require
无论程序何时开始执行都会发生?
最佳答案
是的,require
只是一个普通函数,如果模块在内存中,则返回模块,如果不在内存中,则加载模块,这意味着读取文件,解析它并执行它(并且当然它可能涉及需要其他依赖项)。
对它进行基准测试没有问题(只需确保测量文件的第一个需求,因为模块已缓存)。
如果 require
位于您的文件中但未执行(例如,因为它位于 if
语句后面),它不会比 if 产生更多效果它不在你的文件中。并且在到达语句之前不会发生加载。
关于javascript - 如何计算 Node.js 包的加载时间损失?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50248097/