我正在尝试创建Poolable对象,换句话说,就是回收的对象而不是从头开始创建新对象,这太慢了。
var Poolable = {
pool: [],
new: function(args) {
var obj;
if (this.pool.length > 0) {
obj = this.pool.shift();
obj._recycled = false;
} else {
obj = Object.create(this.prototype);
}
this.apply(obj, arguments);
return obj;
},
delete: function(obj) {
if (obj._recycled) {
throw ("This object has already been recycled!");
}
obj._recycled = true;
this.pool.push(obj);
}
};
var extend = function(a, b) {
for (var i in b) {
if (b[i]) {
a[i] = b[i];
}
}
return a;
};
var Vector = extend(function(x, y) {
this.x = x;
this.y = y;
}, Poolable);
Vector.prototype.add = function(v) {
this.x += v.x;
this.y += v.y;
};
我可以这样使用:
var v = Vector.new(1, 2);
// When I'm done
Vector.delete(v);
我正在对此进行测试,看看是否有任何显着的改进,但随后出现了奇怪的事情:使用Poolable版本在一个大的for循环中更快,而非Poolable版本在小的for循环上要快得多。
小循环: http://jsperf.com/poolable-vs-non-poolable-objects/8
大循环: http://jsperf.com/poolable-vs-non-poolable-objects/9
问题:我在哪里设置测试?
答案 0 :(得分:0)
对于这两个测试,我的poolable基准测试速度比非游泳池慢...我错过了什么?
在非池测试中,您没有删除对象,因此在测试完成时可能会删除它们,从而导致更好的性能。另外我认为poolable版本引入的额外逻辑具有小循环的性能成本,但是开始比大型数据集上的非池更有效,这可能是您正在寻找的?
对于这样一个简单的结构,你是否尝试用以下方法替换整个Object.create + extend:
obj = { x: x, y: y }