nodejs:从require的缓存调用函数和全局范围内的函数一样快吗?

时间:2015-04-26 11:57:03

标签: javascript node.js performance caching require

假设我有一个名为external.js的文件:

// external.js

//define a print function and make it public
module.exports.print = function(text) {
    console.log(text)
}

然后我有一个名为main.js的文件:

// main.js

// call require('./external.js').print so that it'll be in the require's cache
require('./external.js').print('I am now in the cache')

// and define a function equivalent to print in the global scope
function localPrint(text) {
    console.log(text)
}

// Finally, define two functions which use the localPrint and the print in external.js
function echo1(text) {
    require('./external.js').print(text)
}

function echo2(text) {
    localPrint(text)
}

echo1和echo2之间的性能有何不同?
我敢说不会有。访问全局函数应该与require缓存中的函数一样快。你怎么说?

2 个答案:

答案 0 :(得分:1)

  

echo1和echo2之间的性能是否存在差异?

也许是一个小小的,是的。 echo1进行不必要的函数调用(在至少一,require可能会使其他几个)和一个不必要的属性查找(在返回的对象上)(再次,在至少一; require可能需要进行一些属性查找才能在缓存中找到您的资源。

重要是否完全是另一个问题。

我可能会这样做:

var print = require('./external.js').print;

或者,如果您真的更喜欢其他名称:

var echo = require('./external.js').print;

或者是否有理由打包电话:

var print = require('./external.js').print;
function echo(text) {
    print(text);
}

答案 1 :(得分:0)

我刚做了基准测试:

main.js

// main.js

// call require('./external.js').print so that it'll be in the require's cache
var e = require('./external.js');

// and define a function equivalent to print in the global scope
function localPrint() {
    var hello = "hello";
    return hello;
}

var f = {
  hello : function(){
    var hello = "hello";
    return hello;
  }
}

// Finally, define two functions which use the localPrint and the print in external.js
function echo1() {
    e.hello();
}


function echo2() {
    localPrint()
}

function echo3(){
  f.hello();
}

(function (){
  var times = 100000000;
  var start1 = +new Date();
  for (var i = 0; i < times; i++) {
    echo1('text');
  };
  var stop1 = +new Date();

  var start2 = +new Date();
  for (var i = 0; i < times; i++) {
    echo2('text');
  };
  var stop2 = +new Date();

  var start3 = +new Date();
  for (var i = 0; i < times; i++) {
    echo3('text');
  };
  var stop3 = +new Date();

  console.log('From require', stop1,start1, stop1 - start1);
  console.log('From local', stop2,start2, stop2 - start2);
  console.log('From object', stop3,start3, stop3 - start3);
})();

external.js

// external.js
//define a print function and make it public
module.exports.hello = function() {
    var hello = "hello";
    return hello;
}

结果:

From require 1430050276387 1430050276313 74
From local 1430050276460 1430050276387 73
From object 1430050277569 1430050276460 1109

100M呼叫的差异对于要求或局部变量(73&amp; 74 ms)而言并不重要。但是,从一个物体比使用要求慢15倍(1109毫秒)...

使用NodeJS强大的模块系统,而不是创建大对象。

希望它有帮助&amp;我希望它是正确的!