Düğme tıklatıldıktan sonra web çalışanını çağıran bir uygulamanız var. Hesaplamalar, kullanıcı arayüzünü rahatlatmak ve hesaplamalar yapılırken kullanıcı eylemlerine duyarlı hale getirmek için işçiye taşınır.Web Çalışanlarını Kullanarak Olası Bellek Kaçakları (Çöp Toplayıcı)
Her şey yolunda gider ve yaklaşık 0.8-1.5s sonra işçi bir yanıt gönderir. Worker.onmessage'de gereken tüm DOM eylemlerini gerçekleştiriyorum. Ancak bu GC görüntülendikten ve CPU'ya bağlı olarak UI'yi 2 veya daha fazla saniye boyunca engelledikten sonra. Bu gerçekten kafa karıştırıcı, çünkü UI engelleme yapmak istediğim şey.
Burada zaman çizelgesi/bellek konsol sekmesinin ekran görüntüsü: http://i.imgur.com/zUoHa.jpg
GC olaylar sadece tüm DOM manipülasyonlara sonra meydana görebileceğiniz gibi. Aslında sadece tek bir repaint olayı var (DocumentFragment kullanılıyor).
ana js kodu:
var sortWorker = new Worker('js/contactsorter.js');
sortWorker.onmessage = function(e) {
var messages = [];
e.data.forEach(function(userDoc) {
var contactSection = _drawContact(userDoc);
messages.push(contactSection);
});
meta.append(messages); // this actually appends document fragment as a child
};
sortWorker.postMessage(postMessageData);
contactsorter.js (işçi):
onmessage = function(e) {
var uid, output = [], usersStat = {};
// calculations...
postMessage(output);
close();
};
bu yerde ya da olmasın bu GC olayları önlemek için herhangi bir yolu var mı?
UPD: o GC olay (lar) zaman işçiye gönderildiği veri miktarına bağlıdır geliyor bana. UPD2: Kapatma ve önyüklemeden sonra GC olayları sadece iki kez gerçekleşir, böylece bir saniyeden daha az bir süre için kullanıcı arayüzünü engeller. Hımm?
Nesneler ne kadar büyük? Kaç? Ne tür sayılarla konuşuyoruz? Hangi DOM düğümlerini oluşturuyorsunuz? GC olay ölçeği, sıralanan kişi sayısı ile doğrusal olarak mı? –
JSON.stringify, yaklaşık 2M olduğunu söylüyor. Bunlar, çocukları olarak nesneleri olan nesneler. Çalışan yanıtından sonra (bir dizi çıkarır) DocumentFragment oluşturup yakl. Bunun için 400 "div" elemanları. Sonrasında DOM'a parça ekliyorum. Son soruyla ilgili olarak - testi yapmak için kodumu yeniden yazmam gerekiyor, bu yüzden bunu biraz sonra tekrar yorumlayacağım.Btw: yeni UPD –
Son soruyla ilgili olarak: Hayır, GC olayı veri miktarına göre ölçeklenmez. Üstelik, bu zaman dilimi için zaman çizelgesine bakarken http://i.imgur.com/psGpr.png zaman çizelgesinde bile bulamıyorum. –