ボタンのクリック後に Web ワーカーを呼び出すアプリがあります。計算はワーカーに移動され、UI が軽減され、計算中のユーザー アクションに反応するようになります。
すべてがうまくいき、約 0.8 ~ 1.5 秒後にワーカーが応答を送信します。必要なすべての DOM アクションを実行しますが、このworker.onmessage
後ガベージ コレクターが表示され、CPU に応じて 2 秒以上 UI が実質的にブロックされます。UIのブロックは私が防ぎたいものなので、これは本当に私を混乱させます.
タイムライン/メモリ コンソール タブのスクリーンショットは次のとおりです。
ご覧のとおり、ガベージ コレクター イベントはすべての DOM 操作の直後に発生します。実際には、再描画イベントは 1 つだけです (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();
};
この場所でこれらのガベージ コレクター イベントを回避する方法はありますか?
UPD: ガベージ コレクター イベントの時間は、ワーカーに送信されたデータ量に依存するようです。
UPD2: シャットダウンおよび起動後、ガベージ コレクター イベントが 2 回しか発生しないため、UI が 1 秒未満ブロックされます。ん?