私はプール可能なオブジェクトを作成しようとしています。つまり、新しいオブジェクトを最初から作成するのではなくリサイクルされています。性能測定に大きな違いを生むループ
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ループではるかに高速です。
小ループ: http://jsperf.com/poolable-vs-non-poolable-objects/8
ビッグループ: http://jsperf.com/poolable-vs-non-poolable-objects/9
質問:テストのセットアップI混乱をやりましたか?
は、ブラウザのため、このコードですか?その場合、なぜプールを使用する必要がありますか? – gurvinder372
@ gurvinder372はい。私は2D物理エンジンを作ろうとしており、作成されているベクトルの数が多いので、かなり減速していました。 – SlySherZ
ステートレスオブジェクトを使用できない理由は何ですか? – gurvinder372