循环在性能测量方面产生巨大差异

时间:2016-03-25 11:29:50

标签: javascript performance-testing

我正在尝试创建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

问题:我在哪里设置测试?

1 个答案:

答案 0 :(得分:0)

对于这两个测试,我的poolable基准测试速度比非游泳池慢...我错过了什么?

在非池测试中,您没有删除对象,因此在测试完成时可能会删除它们,从而导致更好的性能。另外我认为poolable版本引入的额外逻辑具有小循环的性能成本,但是开始比大型数据集上的非池更有效,这可能是您正在寻找的?

对于这样一个简单的结构,你是否尝试用以下方法替换整个Object.create + extend:

obj = { x: x, y: y }