ボタンをクリックした後でウェブワーカーを呼び出すアプリがあります。計算は、UIを解放するために作業者に移動され、計算が行われている間にユーザーの操作に応答します。ウェブワーカー(ガベージコレクタ)を使用してメモリリークが発生する可能性があります
すべてが正常になり、約0.8-1.5秒後に作業者が応答を送信します。 worker.onmessageでは、必要なすべてのDOMアクションを実行します。しかし、このGCが現れた後、実際にはCPUに応じて2秒以上UIがブロックされます。これは本当に私を混乱させています。なぜなら、UIブロッキングは私が避けたいものだからです。あなたはGCイベントがちょうどすべてのDOM操作の後に起こる見ることができるようにhttp://i.imgur.com/zUoHa.jpg
:ここ
は、タイムライン/メモリコンソール]タブのスクリーンショットです。実際には、再描画イベントは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();
};
は、この場所ではないか、これらのGCイベントを回避するための方法はありますか?
UPD:GCイベントの時間は、作業者に送信されたデータ量によって異なると思われます。 UPD2:シャットダウンと起動後にGCイベントが2回発生するため、UIが1秒未満でブロックされます。え?
オブジェクトの大きさはどれくらいですか?幾つ?どんな種類の数字が話していますか?どんなDOMノードを作成していますか? GCイベントはソートされた連絡先の数に比例して直線的に変化しますか? –
JSON.stringifyによると約2Mです。これはオブジェクトを子として持つオブジェクトです。作業者の応答(配列を出力する)の後、私はDocumentFragmentを作成し、およそを追加します。それに400の "div"要素があります。その後、私はDOMにフラグメントを追加します。最後の質問について - テストをするためにコードを書き直す必要があるので、少し後でコメントします。Btw:new UPD –
最後の質問については、いいえ、データ量に応じてGCイベントはスケールされません。さらに、私はタイムライン上でそれを見つけることさえできませんhttp://i.imgur.com/psGpr.pngこの期間は、UIがクロックされている。 –