节点js加载模块时的性能

时间:2013-11-20 23:30:32

标签: performance node.js

我有几个自定义模块,我每秒呼叫数百次,我想确保调用这些模块不会对性能产生影响。

示例模块 - random-string.js

module.exports = function() {

    // Required modules
    var logs = require(__dirname + '/logs.js'); // Custom logger
    var uuid = require('node-uuid'); // Simple, fast generation of RFC4122 UUIDS

    var randomString = uuid.v1() + uuid.v4();
    logs.dev(randomString);

    return randomString;
};

如果我从另一个模块调用此模块(即require(__ dirname +'/ random-string.js'))并且每秒调用数百次,那么这是一次读取到磁盘每次加载日志.js或node-uuid?

3 个答案:

答案 0 :(得分:5)

不,由require加载的模块由节点缓存(因此它不会每次都进入磁盘),但是仍然没有充分的理由在每个函数调用上加载模块:仍然有一些与调用require并查找缓存的模块对象相关联的开销。

为什么不在模块顶部加载依赖项?

var logs = require(__dirname + '/logs.js'); // Custom logger
var uuid = require('node-uuid'); // Simple, fast generation of RFC4122 UUIDS

module.exports = function() {

    var randomString = uuid.v1() + uuid.v4();
    logs.dev(randomString);

    return randomString;
};

答案 1 :(得分:2)

没有。模块返回值被缓存并重用。

虽然构建代码的更好方法是:

var logs = require(__dirname + '/logs.js'); // Custom logger
var uuid = require('node-uuid'); // Simple, fast generation of RFC4122 UUIDS

module.exports = function() {
  var randomString = uuid.v1() + uuid.v4();
  logs.dev(randomString);
  return randomString;
};

答案 2 :(得分:2)

Node.js缓存模块,以便它们仅在第一次请求时加载。有关详细信息,请参阅http://nodejs.org/api/modules.html#modules_caching