У меня есть приложение, которое вызывает веб-работника после нажатия кнопки.Расчеты переносятся на рабочий, чтобы облегчить пользовательский интерфейс и сделать его отзывчивым на действия пользователя во время выполнения расчетов.
Все идет хорошо, и примерно через 0,8-1,5 с работник отправляет ответ.В worker.onmessage я выполняю все необходимые действия DOM.Но после этого GC появляется и практически блокирует пользовательский интерфейс на 2 или более секунд в зависимости от процессора.Это действительно сбивает с толку, потому что блокировка пользовательского интерфейса - это то, что я хочу предотвратить.
Вот скриншот вкладки временной шкалы / консоли памяти: http://i.imgur.com/zUoHa.jpg
Как вы можете видеть, события GC происходят сразу послевсе манипуляции с DOM.На самом деле есть только одно событие перерисовки (используется DocumentFragment).
основной код js:
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 (работник):
onmessage = function(e) {
var uid, output = [], usersStat = {};
// calculations...
postMessage(output);
close();
};
Есть лиспособ избежать этих событий GC в этом месте или нет?
UPD: мне кажется, что время события GC зависит от объема данных, которые были отправлены работнику.UPD2: после выключения и загрузки события GC происходят только дважды, блокируя пользовательский интерфейс менее чем на секунду.Hm