我有一个应用程序,在单击按钮后调用web worker。计算将移至工作人员以缓解UI并使其在计算过程中对用户操作做出响应。
一切顺利,大约0.8-1.5秒后工人发出回复。在worker.onmessage中,我执行所有需要的DOM操作。但是在此GC出现之后,根据CPU的不同,实际上会阻止UI 2秒或更长时间。这真让我感到困惑,因为UI阻塞是我想要阻止的。
以下是时间轴/内存控制台选项卡的屏幕截图: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事件只发生两次,从而阻止UI不到一秒钟。 HM?
答案 0 :(得分:4)
Web Workers要记住的一件事,特别是在您的示例中使用它们时,您将在将对象发送给工作者时克隆该对象。所以让我们用一个愚蠢的例子来讨论这个问题:
既然你说这是一个chrome应用程序(另一个评论),那么也许你可以重构你的代码以利用Transferable Objects来避免对象Cloning创建临时对象等。当然,使用可转移的对象你必须重组为一个数组缓冲区,这本身就是一个黑魔法。