2016-03-25 11 views
0

Poolable nesneler oluşturmaya çalışıyorum, başka bir deyişle, sıfırdan yeni olanları oluşturmak yerine geri dönüştürülmüş nesneler, bu çok yavaş.Performans ölçümünde büyük bir fark yaratan döngü

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; 
}; 

ben şöyle kullanabilirsiniz:

var v = Vector.new(1, 2); 
// When I'm done 
Vector.delete(v); 
Orada herhangi şikayetler belirgin, ama sonra tuhaf bir şey olup olmadığını görmek için bu test edildi

: Büyük bir iç çok daha hızlı Poolable sürümünü kullanıyor loop için ise, Poolable olmayanlar küçük döngüler için çok daha hızlıdır.

Küçük döngü: http://jsperf.com/poolable-vs-non-poolable-objects/8

Büyük döngü: http://jsperf.com/poolable-vs-non-poolable-objects/9

Soru: pisliği testi kurma mi?

+0

mi: Böyle basit yapısı için

, tüm Object.create + sadece daha uzatılmasını yerine denedi mi? Bu durumda neden bir havuz kullanmalısın? – gurvinder372

+0

@ gurvinder372 Evet. Bir 2D Fizik Motoru yapmaya çalışıyorum ve yaratılan yüksek sayıda Vektör, işi yavaşlatıyordu. – SlySherZ

+0

Vatansız nesnelere neden sahip olamıyorsunuz? – gurvinder372

cevap

0

Her iki sınama için havuz dışı dengesizliği daha yavaş alıyorum ... bir şey mi özlüyorum?

Havuz dışı testte nesneleri silmiyorsunuz, bu yüzden test bittiğinde daha iyi bir perfüre yol açacak şekilde silinebilir. Ayrıca, poolable sürümü tarafından sunulan ekstra mantığın küçük döngüler için bir performans maliyetine sahip olduğunu düşünürdüm ama büyük bir veri kümesinde daha büyük bir veri havuzundan daha verimli olmaya başlar, muhtemelen sizin aradığınız şey nedir? tarayıcı için bu kod

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

Makinemde, Pooble nesneler, firefox kullanarak büyük döngüde iki kat daha hızlıdır. Ayrıca, gerçek vektörlerde sadece 1 değil, bir demet: "add" fonksiyonunu kaçırdınız: add, sub, mult, cross ... – SlySherZ