如果我传递一个变量太多require()会发生什么?

时间:2015-12-01 01:48:24

标签: javascript node.js performance

我在我的NodeJS文件夹中将players变量向下传递了3个级别。

第一个文件是server.js,它有

var players = {};
require('./routines')(players);

在例程文件夹中,这是 index.js:

module.exports = function (players) {
  var addHp = require('./addHp')(players);
}

addHp.js:

module.exports = function (players) {
  var addHp = setInterval ( function () {
    for (var player in players) {
       //...
    }
  }, 30000);
}

我想知道这样做的表现是什么。 players引用仅在服务器初始化时发送?有太多参考文献有什么缺点吗?除了不好的做法,假设我有100个要求内部需要接收players,我会有问题吗?

1 个答案:

答案 0 :(得分:2)

从性能的角度来看,这确实应该不是问题。这不像我们在一个循环中执行requires一百万次。考虑到查找成本,即使是已经加载的模块require也可能有点昂贵,但它必须在某个密集循环中才能成为一个问题。

此外,关于向这个players对象传递对三个函数调用的引用,它实际上可能比具有一些全局性更便宜。与普遍看法相反,将全局变量的内容复制到本地范围通常比全局变量便宜或便宜(前提是副本便宜,参考的情况也是如此)。这是因为从编译器的角度来看是这样的:

module.exports = function (players) {
  var addHp = require('./addHp')(players);
}

...它可以假设这个players参数(函数的本地参数)在那段时间内不会引用其他任何东西,因为它只能在函数内看到它在任何时候都没有被赋值给其他任何东西。那个时期。

正因为如此,编译器更容易应用优化,它可以将此players引用一次移动到寄存器中并保持在那里,而不必每次在较慢的内存中重新加载它功能。当然,即使players是全局的,一个非常积极的优化器仍然可以避免这种情况,但是做出这个假设更加困难,并且可以安全地说这里的引用的本地副本将是快速或更快的