2016-03-25 13 views
0

私はプール可能なオブジェクトを作成しようとしています。つまり、新しいオブジェクトを最初から作成するのではなくリサイクルされています。性能測定に大きな違いを生むループ

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混乱をやりましたか?

+0

は、ブラウザのため、このコードですか?その場合、なぜプールを使用する必要がありますか? – gurvinder372

+0

@ gurvinder372はい。私は2D物理エンジンを作ろうとしており、作成されているベクトルの数が多いので、かなり減速していました。 – SlySherZ

+0

ステートレスオブジェクトを使用できない理由は何ですか? – gurvinder372

答えて

0

私は両方のテストでプール以外のベンチマークよりも遅いプールを取得しています...何か不足していますか?

非プールテストでは、オブジェクトを削除していないので、テストが終了したときに削除され、より良いパフォーマンスが得られます。また、プール可能なバージョンで導入された余分なロジックには、小さなループのパフォーマンスコストがあると思いますが、大規模なデータセットの非プールより効率的になり始めます。これはおそらくあなたが探しているものでしょうか?このような単純な構造のために

、あなたは全体のObject.create +はただで延長交換してみました:

obj = { x: x, y: y } 
+0

私のマシンでは、Poolableオブジェクトは、firefoxを使用して、大きなループで2倍高速です。また、実際のベクターでは1だけでなく、それらの束である「追加」機能が欠けていた:add、sub、mult、cross ... – SlySherZ

関連する問題