我即将运行一些针对
之间差异的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测试可能会告诉我哪些/什么但不是为什么。另外,如果您知道其中任何一种模式的名称,请告诉我,谢谢。
答案 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
倍,但两者都非常快(显然),所以除非你正在编写一个框架,否则可能没什么大不了的。