私はすべてのAJAXリクエストをWebワーカーを使用して処理するコードを使用しています(利用可能な場合)。これらのワーカーはXMLHttpRequest
オブジェクトの処理以外にほとんど何もしません(余分な計算はありません)。ワーカーによって作成されたすべてのリクエストは非同期です(request.open("get",url,true)
)。
最近、私はこのコードに関していくつかの問題を抱えており、これを修正するのに時間を費やすべきか、それともソリューション全体をダンプするべきか疑問に思い始めました。
これまでの私の調査は、このコードが実際にパフォーマンスを低下させている可能性があることを示唆しています。しかし、これを裏付ける信頼できる情報源を見つけることができませんでした。私の2つの調査結果は次のとおりです。
誰かがこの問題について議論している信頼できる情報源を私に示すことができますか?または、私の疑問を払拭する可能性のあるベンチマークはありますか?
[[〜#〜] edit [〜#〜]]この質問は、WebWorkerも結果の解析(JSON.parse
)。非同期解析はパフォーマンスを向上させますか?
jsperfの適切なベンチマーク を作成しました。ブラウザに応じて、WebWorkerアプローチは、生のajax呼び出しよりも85-95%遅くなります。
ノート:
new XMLHttpRequest()
とJSON.parse(jsonString);
のみをテストしています。 realAJAX呼び出しが行われていません。最初に覚えておかなければならないのは、Webワーカーは時間をかけずに処理を高速化することはめったになく、ユーザーインタラクションに関連する処理がブロックされないようにバックグラウンドスレッドに計算をオフロードするという意味で処理を高速化します。たとえば、データの転送を考慮に入れると、膨大な計算を行うのに4秒ではなく8秒かかる場合がありますが、メインスレッドで実行した場合、ページ全体が4秒間フリーズするため、許容できません。
これを念頭に置いて、ajax呼び出しは非ブロッキングであるため、メインスレッドからajax呼び出しだけを移動しても何も得られません。しかし、JSONまたはそれ以上を解析する必要がある場合は、大きなリクエストから小さなサブセットを抽出すると、Webワーカーが手助けします。
私が聞いたが確認されていない警告は、ワーカーがメインページとは異なるキャッシュを使用するため、同じリソースがメインスレッドとワーカーに読み込まれている場合、作業が大幅に重複する可能性があることです。
間違った場所でコードを最適化しています。
AJAX要求はすでに別のスレッドで実行されており、それらが満たされると(そして定義されたコールバック関数を呼び出すと)メインイベントループに戻ります。
Webワーカーはスレッドへのインターフェースであり、計算量の多い操作を対象としています。古典的なデスクトップアプリケーションのように、時間がかかる計算でインターフェイスをブロックしたくない場合。
非同期IOはJavascriptの重要な概念です。
まず、リクエストはすでに非同期であり、IOは非ブロッキングであり、リクエスト中に別のJavascriptコードを実行できます。ワーカーでコールバックを実行することは、リクエストよりもはるかに興味深いです。
次に、JavaScriptエンジンはすべてのコードを同じスレッドで実行します。新しいスレッドを作成する場合は、 ワーカーメッセージでデータ通信を処理する必要があります。 api ( セマフォ を参照)。
結論として、JavaScriptの非同期およびシングルスレッドの性質は強力であり、それを可能な限り使用し、長いJavaScriptプロセスなどで本当に必要な場合にのみワーカーを作成します。
私の経験から、WebワーカーはAJAX=呼び出しに使用しないでください。最初に、非同期です。つまり、情報が返されるのを待っている間も、コードは実行されます。
現在、ワーカーを使用して応答を処理することは、間違いなくWebワーカーを使用できるものです。いくつかの例:
編集:別の良い読みは次のようになります: Webワーカーでの同期リクエストに関する意見