0

これは大した問題ではありませんが、突然の悟りのようなものです。

したがって、次のようにjavascriptで連続して実行される2つの初期化関数があります。

object1.Init();
object2.Init();

だから私は、それらを「より速く」するために、両方を同時に呼び出して、この方法で同時に実行できるようにすることができると考えました。

setTimeout(function() {
    object1.Init();
}, 0);

setTimeout(function() {
    object2.Init();
}, 0);

私の理論的根拠は、これを行うと、両方の機能が「同時に」開始され、それぞれが終了するまでに時間がかかるというものでした (一方は 300ms で終了し、もう一方は 500ms で終了する場合があります)。

うわー、最初は良いアイデアだと思ったのですが、両方のInit()関数がグローバル変数を使用していることに気付きました。

そのため、私の仮定が正しいかどうかを確認するために、この簡単なテストを実行することになりました。

var cnt = 0;
var x1 = 0;
var x2 = 0;

setTimeout(function() {
    t1 = new Date().getTime();
    for (cnt=0; cnt<1000000000; cnt++) {
        x1++;
    }
    t2 = new Date().getTime();
    document.getElementById("mydiv").innerHTML += "<br>" + (t2-t1) + " milliseconds " + x1 + "#" + t1 + "#" + t2;
}, 0);

setTimeout(function() {
    var t3 = new Date().getTime();
    for (cnt=0; cnt<1000000000; cnt++) {
        x2++;
    }
    var t4 = new Date().getTime();
    document.getElementById("mydiv").innerHTML += "<br>" + (t4-t3) + " milliseconds " + x2 + "#" + t3 + "#" + t4;
}, 0);

その結果は次のとおりです。

2504 milliseconds 1000000000#1379702812419#1379702814923
2514 milliseconds 1000000000#1379702814923#1379702817437

本当に私に言ったことは次のとおりです。

a)最初のループが終了した後に2番目のループが開始されるため、JavaScriptには同時実行性などはありません

b)したがって、私は安全です。グローバル変数は影響を受けません

c) このように settimeout() を使用して 2 つの init() 関数を実行しても意味がありません

a) は、javascript がシングル スレッドであるという事実によるものだと思いますが、これは本当に残念なことです (はい、私は Web ワーカーについて知っています)。

4

2 に答える 2

1

a)最初のループが終了した後に2番目のループが開始されるため、JavaScriptには同時実行性などはありません

そうです、あなたが言ったように、JavaScript はシングル スレッドで実行され、同時操作などはありません。

b)したがって、私は安全です。グローバル変数は影響を受けません

はい、安全です。

c) このように settimeout() を使用して 2 つの init() 関数を実行しても意味がありません

それはそう...

于 2013-09-20T19:11:37.170 に答える
0

あなたは「javascript」についてグローバルに話していますが、ブラウザのコンテキストで議論しています。

Asyncライブラリをチェックすることをお勧めします。ノートで使っています。完全に標準的なプロセッサのスライスを使用して、複数の操作を「同時に」実行します。技術的には単一のスレッドである可能性がありますが、(おそらく) 慣れている方法ではなく、各行がブロックされ、前の行が実行されるまで何も起こりません。非同期コールバックがあるときはいつでも、複数の同時スレッドをシミュレートする動作があります。

これを試すには、HTTP リクエスト (または 7) を作成し、さまざまな非ブロッキング時間にコールバックが返されるのを確認します。または、ファイル システムの呼び出し、SQL の呼び出し、または環境に関与するために思い切ったものを試してみてください。あらゆる状況で、「マルチスレッド」の動作が発生します。

于 2013-09-20T21:37:57.410 に答える