3

大量のデータをブラウザーの localStorage に保存し、ページの読み込みごとに解析する Chrome 拡張機能を作成しています。データのサイズが大きくなると、ページの読み込み時間/パフォーマンスが低下し始めます。そこで、解析を Web ワーカーに委任することを考えました。しかし、それが価値があるかどうかは疑問です。私ができることは、このように解析する文字列をワーカーに渡すことです。

worker.postMessage(localStorage['myObj']);

そして、この文字列を JSON に解析し、メイン スレッドに送り返す予定です。

worker.onMessage(function(myObj){
    //Then Play around with my object here.
});

しかし、メッセージの投稿やリッスンのオーバーヘッドなど、このメソッドのパフォーマンスの側面、および一部のブラウザではメッセージでの JSON オブジェクトの送信が許可されておらず、送信中に自動的にシリアル化されるという事実について調べたので、このメソッドが価値があるかどうかは疑問です.

私のアプリは単なる Chrome 拡張機能であり、Firefox アドオンでもあるため、これら 2 つのブラウザーだけに関心があります。この方法がこれら 2 つのブラウザに適しているかどうか、誰か教えてもらえますか?

4

2 に答える 2

14

現在受け入れられている答えは単に間違っています。以下の例のように、あなたが尋ねたことを実行することは完全に実行可能です。

実行する価値があるかどうかは、実際のシナリオで実際のデータを使用して確認する必要があります。JSON テキストをワーカーに送信し、解析された結果を返送することに関連するオーバーヘッドがあり (おそらく JSON ではありませんが、隠れたシリアライゼーションが含まれる可能性があります)、最新のブラウザーは JSON を非常に高速に解析します。

オーバーヘッドはそれほど価値がないと思いますが、ブラウザーのネイティブのシリアル化メカニズムが JSON よりもはるかに高速であるか、メインの UI スレッド以外のスレッドで実行される場合、おそらく巨大な JSON 文字列ではそうなる可能性があります。


ワーカーを使用して JSON を解析する例:

// This stands in for 'worker.js':
var blob = new Blob([
  'this.onmessage = function(message) {\n' +
    'postMessage(JSON.parse(message.data));\n' +
  '};'
  ], { type: "text/javascript" });
var workerUrl = URL.createObjectURL(blob);

// Main script:
var w = new Worker(workerUrl/*"worker.js"*/);
w.onmessage = function(message) {
    display("Got response: typeof message.data: " + typeof message.data);
    display("message.data.for = " + message.data.foo);
};

display('Posting JSON \'{"foo":"bar"}\' to worker');
w.postMessage('{"foo":"bar"}');

function display(msg) {
    var p = document.createElement('p');
    p.innerHTML = String(msg);
    document.body.appendChild(p);
}
body {
  font-family: monospace;
}

結果:

JSON '{"foo":"bar"}' をワーカーに投稿する
得られた応答: typeof message.data: object
message.data.for = バー
于 2015-05-26T08:23:41.797 に答える
1

WebWorker との間で受け渡しできるのは、オブジェクトではなく、文字列のみです。WebWorker 内で文字列を JSON オブジェクトに解析する場合、オブジェクトを文字列化してから、ワーカーからメイン スクリプトに渡すときに再解析する必要があります。明らかに、これにより JSON が不必要に二重解析されるため、悪い考えです。

2017 更新: 文字列以外のものが許可されるようになりました。参照用に、(はるかに新しい)回答とコメントのいくつかを参照してください。

于 2013-01-24T19:18:53.397 に答える