循环在性能测量中产生了巨大的差异
Loop making a huge difference in performance measurement
我正在尝试创建可池对象,或者换句话说,是回收的对象,而不是从头开始创建新对象,这太慢了。
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);
我对此进行了测试,看看是否有任何明显的改进,但后来发生了一件奇怪的事情:在大for循环中使用Poolable版本要快得多,而在小for循环中不使用Poolable的版本要快的多。
小循环:http://jsperf.com/poolable-vs-non-poolable-objects/8
大循环:http://jsperf.com/poolable-vs-non-poolable-objects/9
问题:我在哪里把考试搞砸了?
对于这两个测试,我得到的可池基准测试都比非池基准测试慢。。。我是不是错过了什么?
在非池测试中,你没有删除对象,所以当测试完成时,它们可能会被删除,这会带来更好的性能。此外,我认为可池版本引入的额外逻辑对小循环有性能成本,但开始比大数据集上的非池更高效,这可能就是你想要的?
对于这样一个简单的结构,您是否尝试将整个Object.create+extend替换为:
obj = { x: x, y: y }
相关文章:
- 为什么不't Javascript对我的输入值进行了一些重新检查
- javascript结合了数组和字典
- JQuery合并了keyup和focusout两个函数
- jQuery中是否内置了任何字符串格式化函数
- 我的职位回报太快了,如何做出承诺
- 我的jQuery插件参数没有正确启动,遇到了问题
- Firebase迁移-简单的Firebase.set没有'不再工作了——旧的还是新的
- chrome扩展:尽管运行了at:documentidle,js脚本还是过早启动
- 在safari和chrome中,js图像加载产生了奇怪的结果
- jQuery巨大的selectbox导致Uncaught RangeError:超过了最大调用堆栈大小
- 循环在性能测量中产生了巨大的差异
- $http调用似乎产生了无限$digest循环
- 弄乱jquery产生了意想不到的结果
- 正在限制文本区域中的字数..但当我输入最大字数时,输入的文本突然变成了一个巨大的字符串
- Box2d创造了一个巨大的身体——把它分开
- 为什么这个函数产生了'undefined'
- 两行几乎相同的代码却产生了不同的结果
- js在移动设备上产生了一些不想要的效果
- 为什么IE浏览器将我的内容推到页面的一半,好像在上面创造了一个巨大的边距
- 递归函数中的Array.prototype.reduce产生了意想不到的结果