web-dev-qa-db-ja.com

AJAX呼び出しを処理するWebワーカー-最適化過剰

私はすべてのAJAXリクエストをWebワーカーを使用して処理するコードを使用しています(利用可能な場合)。これらのワーカーはXMLHttpRequestオブジェクトの処理以外にほとんど何もしません(余分な計算はありません)。ワーカーによって作成されたすべてのリクエストは非同期です(request.open("get",url,true))。

最近、私はこのコードに関していくつかの問題を抱えており、これを修正するのに時間を費やすべきか、それともソリ​​ューション全体をダンプするべきか疑問に思い始めました。

これまでの私の調査は、このコードが実際にパフォーマンスを低下させている可能性があることを示唆しています。しかし、これを裏付ける信頼できる情報源を見つけることができませんでした。私の2つの調査結果は次のとおりです。

  • 2歳 jQuery機能の提案 AJAX呼び出しにWebワーカーを使用する
  • this SO少し違う何かについて尋ねているように見える質問(Webワーカーでの同期リクエストを使用するvs AJAX呼び出し)

誰かがこの問題について議論している信頼できる情報源を私に示すことができますか?または、私の疑問を払拭する可能性のあるベンチマークはありますか?

[[〜#〜] edit [〜#〜]]この質問は、WebWorkerも結果の解析(JSON.parse)。非同期解析はパフォーマンスを向上させますか?

43
Konrad Dzwinel

jsperfの適切なベンチマーク を作成しました。ブラウザに応じて、WebWorkerアプローチは、生のajax呼び出しよりも85-95%遅くなります


ノート:

  • ネットワークの応答時間はリクエストごとに異なる可能性があるため、new XMLHttpRequest()JSON.parse(jsonString);のみをテストしています。 realAJAX呼び出しが行われていません。
  • WebWorkerのセットアップとティアダウン操作は測定されていません
  • 私は単一のリクエストをテストしていることに注意してください、ウェブワーカーアプローチの結果は複数の同時リクエストの方が良いかもしれません
  • Calvin Metcalfは、jsperfで同期と非同期を比較しても正確な結果が得られないことを説明し、非同期オーバーヘッドを排除する 別のベンチマーク を作成しました。結果はまだWebWorkerアプローチが大幅に遅いことを示しています。
  • Redditディスカッション から、メインページとWebWorkerの間で受け渡されるデータがコピーされ、プロセスでシリアル化する必要があることがわかりました。したがって、解析にのみWebWorkerを使用しても意味がありません。データをメインページで使用する前に、データをシリアル化および逆シリアル化する必要があります。
26
Konrad Dzwinel

最初に覚えておかなければならないのは、Webワーカーは時間をかけずに処理を高速化することはめったになく、ユーザーインタラクションに関連する処理がブロックされないようにバックグラウンドスレッドに計算をオフロードするという意味で処理を高速化します。たとえば、データの転送を考慮に入れると、膨大な計算を行うのに4秒ではなく8秒かかる場合がありますが、メインスレッドで実行した場合、ページ全体が4秒間フリーズするため、許容できません。

これを念頭に置いて、ajax呼び出しは非ブロッキングであるため、メインスレッドからajax呼び出しだけを移動しても何も得られません。しかし、JSONまたはそれ以上を解析する必要がある場合は、大きなリクエストから小さなサブセットを抽出すると、Webワーカーが手助けします。

私が聞いたが確認されていない警告は、ワーカーがメインページとは異なるキャッシュを使用するため、同じリソースがメインスレッドとワーカーに読み込まれている場合、作業が大幅に重複する可能性があることです。

16
Calvin

間違った場所でコードを最適化しています。

AJAX要求はすでに別のスレッドで実行されており、それらが満たされると(そして定義されたコールバック関数を呼び出すと)メインイベントループに戻ります。

Webワーカーはスレッドへのインターフェースであり、計算量の多い操作を対象としています。古典的なデスクトップアプリケーションのように、時間がかかる計算でインターフェイスをブロックしたくない場合。

6
Radu Potop

非同期IOはJavascriptの重要な概念です。

まず、リクエストはすでに非同期であり、IOは非ブロッキングであり、リクエスト中に別のJavascriptコードを実行できます。ワーカーでコールバックを実行することは、リクエストよりもはるかに興味深いです。

次に、JavaScriptエンジンはすべてのコードを同じスレッドで実行します。新しいスレッドを作成する場合は、 ワーカーメッセージでデータ通信を処理する必要があります。 apiセマフォ を参照)。

結論として、JavaScriptの非同期およびシングルスレッドの性質は強力であり、それを可能な限り使用し、長いJavaScriptプロセスなどで本当に必要な場合にのみワーカーを作成します。

3
jsan

私の経験から、WebワーカーはAJAX=呼び出しに使用しないでください。最初に、非同期です。つまり、情報が返されるのを待っている間も、コードは実行されます。

現在、ワーカーを使用して応答を処理することは、間違いなくWebワーカーを使用できるものです。いくつかの例:

  • 応答を解析して大きなモデルを構築する
  • 応答からの大量のデータの計算
  • AJAX応答と組み合わせてテンプレートエンジンで共有Webワーカーを使用してHTMLを作成し、DOMに追加するために返されます。

編集:別の良い読みは次のようになります: Webワーカーでの同期リクエストに関する意見

1
transformerTroy