5

JavaScriptを使用していて、このことに気づきました。使用できます

var i=0; 
var startingTime=new Date().getTime();
setInterval("foo()",1);
function foo() {
    i+=1;
    if ($("#foodiv").text()==i) {
        //we detected a doubled value (parallel execution)
        $("#repdiv").append("[repetition on "+i+"]");
    }
    $("#foodiv").html(i);
    $("#timediv").html(Math.floor((new Date().getTime()-startingTime)/1000));
}

しかし、私が読んで自分で試してみると、時間は 1ms ではなく、少なくとも 10ms か何かです。実際、10 秒後、i の値は 2300/2400 前後であり、予想どおり 10000 ではありません。

これは、手順の可能な最小時間係数です??? 確かにいいえ。私がこれを試してみると:

<html><head>
<script language="javascript" type="text/javascript" src="jquery-1.4.min.js"></script>
<script type="text/javascript">

var i=0;
var startingTime=new Date().getTime();

setInterval("foo()",1);setInterval("foo()",1);setInterval("foo()",1);
setInterval("foo()",1);setInterval("foo()",1);setInterval("foo()",1);
setInterval("foo()",1);setInterval("foo()",1);setInterval("foo()",1);
setInterval("foo()",1);setInterval("foo()",1);setInterval("foo()",1);
setInterval("foo()",1);setInterval("foo()",1);setInterval("foo()",1);
setInterval("foo()",1);setInterval("foo()",1);setInterval("foo()",1);
setInterval("foo()",1);setInterval("foo()",1);setInterval("foo()",1);
setInterval("foo()",1);setInterval("foo()",1);setInterval("foo()",1);

function foo() {
    i+=1;
    if ($("#foodiv").text()==i) {
        //we detected a doubled value (parallel execution)
        $("#repdiv").append("[repetition on "+i+"]");
    }
    $("#foodiv").html(i);
    $("#timediv").html(Math.floor((new Date().getTime()-startingTime)/1000));

}
</script>
</head>
<body>
<div id="foodiv"></div>  (counter)
<br/>
<div id="timediv"></div> (seconds passed)
<br/>
<div id="repdiv"></div>
<br/>
</body>
</html>

カウンターは非常に速く進み、10 秒後には値が 12000 になります !!!!. 呼び出しが並行して実行されないため、それは私にとっては説明できません (または、少なくとも異なる呼び出しに対して i の値を 2 倍にして、repdiv div を計算することができます)。

誰かが私にそれを説明できますか?これらすべての呼び出しによってCPUが非常にストレスを受けていることは知っていますが、少なくとも驚くほど高速になります.

あなたのすべての回答とフォーラムの他のクエストを読み、私の考えを確認しました。しかし、本当の問題は、なぜ!? 複数の連続呼び出しを実行して時間を大幅に短縮できるのに、制限を 15ms に設定したのはなぜですか? この複数のコールバック システムは適切な方法ではないと確信していますが、私はそれを行うことができ、CPU 負荷を飽和させる可能性があります。

4

5 に答える 5

8

いいえ、Javascriptはシングルスレッドです。setIntervalまたはを実行するsetTimeoutと、イベントが生成され、ブラウザの実行キューに追加されます。したがって、コード自体が実行したいときに正確に実行されることを保証することはできませんが、イベントが生成されるたびにイベントが生成されることを確認できます。したがって、この場合、互いに非常に接近して生成されている12のイベントがあります。1間隔の値として使用していることに気付きました。ただし、ほとんどのブラウザの最小値はおよそです15(詳細については、ここを参照してください)。ブラウザは、実行キューにある順序でイベントを実行します(でsetInterval、イベントは追いつくように再生しようとします。その答えを見てください。詳細については、Marcelにリンクしています)。

これが意味するのは、最初のシナリオでは、15ミリ秒ごとに1つのイベントが生成されるということです。そのため、カウンターの増分は遅くなります。ただし、2番目のケースでは、15ミリ秒ごとに互いにかなり接近して発生する12のイベントがあるため、カウンターの増分がはるかに速くなります。

于 2010-10-27T21:20:23.390 に答える
2

JavaScriptタイマー値は、小さい値が指定されている場合でも、ほとんどのブラウザーで少なくとも15ミリ秒に設定されています。AFAIKのみGoogleChromeは4msを使用します。JavaScriptアニメーションループで使用するのに最適な「フレームレート」(setInterval delay)を決定する方法の受け入れられた回答も参照してください。。

于 2010-10-27T21:15:01.750 に答える
1

いいえ、JavaScriptにはマルチスレッドがありません。少なくとも現時点ではありません。

この回答を読んで、どのようにsetInterval機能するかを確認してください。

于 2010-10-27T21:17:59.373 に答える
1

投稿したコードは実行されません。修正されたコードは次のとおりです。

var i=0; 
setInterval(foo,1);

function foo() {
  i+=1;
  if ($("#foodiv").text()==i) {
    //we detected a doubled value (parallel execution)
    $("#repdiv").append("[repetition on "+i+"]");
  }
  $("#foodiv").html(i);
}

コードの実行中に CPU パフォーマンスを見ると、ほとんど機能していないことがわかります。つまり、レートが低いのは、コードがビジーであることが原因ではないことを意味します。要求したほど頻繁に間隔が発生しません。

(12 間隔を開始しても、負荷はほとんど目立ちません。コアの 1 つで 100% に近い負荷を得る前に、200 間隔を開始しました。)

ブラウザは、何らかのクロックを使用して起動する間隔を決定します。通常、そのクロックの分解能はミリ秒よりも低くなります。そのため、間隔は次のクロック ティックまで再び発生しません。この場合、約 15 ミリ秒離れているようです。

于 2010-10-27T21:33:45.043 に答える
0

メソッドに渡される2番目の値setIntervalは、実際には最小値です。1は1ミリ秒を表しますが、ほとんどのブラウザでこのタイムアウトが発生する可能性はほとんどありません。別の回答によると、15ミリ秒程度である可能性が高いとのことです。

それでも、最小値である2番目の項目は、最初のサンプルを適切に説明しています。

2番目のサンプルもこの動作によって説明されます。呼び出す各setIntervalメソッドは、完全に個別のコールバックを登録します。それらはそれぞれ最低1つありますが、相互に依存していません。したがって、すべてが同じ1ミリ秒間隔で発砲することは完全に有効です(それぞれが再発砲する前に1ミリ秒待機している限り)。

于 2010-10-27T21:17:05.043 に答える