使用绑定与仅传递之间的性能差异'这个'

时间:2016-03-09 19:05:12

标签: javascript node.js

我即将运行一些针对

之间差异的jsPerf测试
    function Pool(){


    }

    function internal(data){   //private function


    }

    Pool.prototype.run = function(data){   // public function

       return internal.bind(this)(data);

    }

    module.exports = Pool;

与避免绑定调用相比,只是通过'这个'私人职能:

function Pool(){


}

function internal(pool, data){   //private function


}

Pool.prototype.run = function(data){   // public function

   return internal(this, data);

}

module.exports = Pool;

我认为使用后一种模式更有效率,是否存在可能性能较差的理论情况? jsPerf测试可能会告诉我哪些/什么但不是为什么。另外,如果您知道其中任何一种模式的名称,请告诉我,谢谢。

1 个答案:

答案 0 :(得分:0)

好吧,jsPerf并没有真正为我做这件事,而且由于Node.js可以访问更高分辨率的计时,我想我会自己进行测试。

所以我们有两个要测试的文件:

// one.js

function Pool(){

}

function internal(data){
    return this['x'] = data;
}


Pool.prototype.init = function(data){
    return internal.bind(this)(data);
};

module.exports = Pool;

// two.js

function Pool(){


}

function internal(pool,data){
    return pool['x'] = data;
}


Pool.prototype.init = function(data){
    return internal(this,data);
};

module.exports = Pool;

然后我们测试文件one.js就像这样:

const Pool = require('./one');


var time = process.hrtime();


for (var i = 0; i < 1000; i++) {

   var x =  new Pool().init(String(i) + 'yeah');

}

var diff = process.hrtime(time);

console.log('benchmark took %d nanoseconds', diff[0] * 1e9 + diff[1]);

我们测试文件two.js就像这样:

const Pool = require('./two');


var time = process.hrtime();


for (var i = 0; i < 1000; i++) {

    var x = new Pool().init(String(i) + 'yeah');

}


var diff = process.hrtime(time);

console.log('benchmark took %d nanoseconds', diff[0] * 1e9 + diff[1]);

我从https://nodejs.org/api/process.html#process_process_hrtime

取消了基准代码

因此,运行测试一个

3091851 nanoseconds

并且运行测试2需要

802445 nanoseconds

所以直接传递这个看起来更快,但真的是多少?

差异是

2289406 nanoseconds

这样只有2.28毫秒的差异,这似乎并不值得关注。

但是,总而言之,在不使用bind的情况下,我们发现,避免绑定会导致代码的速度提高4x,因为3091851/802445 = 3.85

所以没有绑定,你的代码运行速度会快~3.85倍,但两者都非常快(显然),所以除非你正在编写一个框架,否则可能没什么大不了的。