47

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

最近、このコードに関していくつかの問題が発生したため、これを修正するのに時間を費やすべきか、ソリューション全体をダンプするべきかを考え始めました。

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

  • AJAX 呼び出しに Web ワーカーを使用するための 2 年前のjQuery 機能の提案
  • this SO question 少し異なることについて尋ねているようです (Web ワーカーと AJAX 呼び出しで同期リクエストを使用)

この問題について話し合っている信頼できる情報源を教えてもらえますか? または、私の疑問を払拭するベンチマークはありますか?

[編集] WebWorker が結果の解析も担当する場合、この質問はもう少し興味深いものになります ( JSON.parse)。非同期解析はパフォーマンスを改善していますか?

4

5 に答える 5

29

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


ノート:

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

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

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

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

于 2014-10-07T12:10:15.860 に答える
7

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

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

Web ワーカーはスレッドへのインターフェイスであり、計算コストの高い操作を目的としています。時間のかかる計算でインターフェイスをブロックしたくない場合は、従来のデスクトップ アプリケーションと同様です。

于 2014-10-07T12:55:46.850 に答える
3

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

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

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

結論として、JavaScript の非同期およびシングル スレッドの性質は強力です。たとえば、長い Javascript プロセスなど、本当に必要な場合にのみ、JavaScript をできるだけ使用し、ワーカーを作成してください。

于 2014-10-07T11:15:17.110 に答える