0

JavaScriptを初めて使用しているので、n00bであることを私に許してください。JavaScriptでの並列処理シミュレーション

集中的な計算が必要な場合は、再帰的またはそれ以外のループが発生する可能性があります。時々、これは4つの関数を実行する再帰的ループであり、それらの関数のそれぞれがDOMツリー全体を歩き、位置を読み込み、衝突検出などのために数学を行うことを意味することがあります。

最初の関数はDOMツリーを歩いていますが、次の関数は最初の関数が終了するのを待たなければなりません。これを実行するのではなく、プログラムの外で別々にループ内ループを起動し、その計算自体を実行していないために遅く実行される別のループで計算を行うのはなぜですか?

遅延または賢い?

ありがとうございます!

+0

まず、ドームツリーを歩いていますか?なぜ衝突する可能性があるすべてのDOM要素を集めて配列に入れるのでしょうか。私は、衝突ポイントであるのはほんの僅かであり、すべてではないと確信しています。次に、setTimeout関数を使用してjavascriptで擬似マルチスレッドを行うことができます。 setTimeout(function(){...}、1);与えられた関数を1ミリ秒で実行します。 – Zoidberg

+0

あなたの質問には関係ありませんが、Chromes [NaCl](https://developers.google.com/native-client/overview)を参考にしてください –

答えて

0

JavaScriptは決してこのような計算集約的なタスクを実行することを意味するものではなく、これが変化しても、JavaScriptは本質的にシングルスレッドであるという事実が残っています。最近のweb workersテクノロジは、限られた形式のマルチスレッドを提供しますが、これらのワーカースレッドはDOMに直接アクセスできません。彼らは主スレッドにメッセージを送信/受信することしかできず、主スレッドに代わってメッセージにアクセスすることができます。

0

現在のところ、JSで実際の並列処理を行う唯一の方法は、Web Workersを使用することですが、最近のブラウザでのみサポートされています。プログラムにこのようなことが必要な場合は、適切なツールを使用していない可能性があります(たとえば、DOMツリーのウォーキングは通常querySelectorAllなどのDOMセレクタを使用して行います)。

4

長期間の計算は、正確にはWeb Workersとなります。あなたが記述しているのは、プロデューサーおよび/またはコンシューマー・スレッドの共通パターンです。 Web Workersを使用してこれを行うことはできますが、高度な並列システムでも同期オーバーヘッドがどのような利得よりも大きくなる可能性があります。

JavaScriptは計算量の多いアプリケーションには理想的な言語ではありません。また、Webブラウザマシンの処理能力は大きく変わる可能性があります(ローエンドのスマートフォンと16coreのワークステーションを考えてみてください)。したがって、サーバー上で複雑なものを計算し、結果をクライアントに送信して表示することを検討してください。

あなたの毎日のWebアプリケーションでは、シングルスレッドアプローチをとり、問題が発生するとパフォーマンスを分析する必要があります。ヘック、ここであなたのパフォーマンスの問題について助けを求めてみませんか?