2012-03-10 24 views
40

私はsetTimeoutの最小ミリ秒の値は何ですか?

var minValue = 0; 
if (typeof callback == 'function') { 
    setTimeout(callback, minValue); 
} 

私はJavaScriptでコールバック関数を実装し、このコード入れたいと思います。

しかし、私は現代的なブラウザと一部の古いブラウザ

が異なる最小タイムアウト値を持っていることを発見しました。

ゼロは最小値ではありません。

近代的なブラウザと互換性の問題のためのいくつかの古いブラウザ用のsetTimeoutの最小値は何でしょうか?

+6

[MDN参照](https://developer.mozilla.org/en/DOM/window.setTimeout#Minimum_delay_and_timeout_nesting)。あなたが指定した時間は決して信頼できるものではありません。 – pimvdb

+1

あなたはいつもテストを書くことができます... –

+0

@BradChristie UnitTest JavaScriptコードはどうやってですか? TDD? – InspiredJW

答えて

39

私はそれを使って多くのコードを見たので、10はすべてのブラウザで最も信頼性の高い最小値になると思います。実際に

しかし、4ms is the minimum for HTML5

、4msのは、HTML5仕様で指定され、2010年以降にリリースされ、ブラウザ間で一貫性があります。以前は(Firefox 5.0/Thunderbird 5.0/SeaMonkey 2.2)、ネストされたタイムアウトの最小タイムアウト値は10ミリ秒でした。

+0

申し訳ありませんが、これは真実ではありません。メモを除いて、[標準](http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#timers)で4msの遅延に関する声明を見つけることができません:注:タイマーは入れ子にすることができますが、5つのネストされたタイマーの後、間隔は少なくとも4ミリ秒に強制されます。さらに好奇心でGoogleグループの[この偉大な投稿(https://groups.google.com/a/chromium.org/forum/#!msg/blink-dev/Hn3GxRLXmR0/XP9xcY_gBPQJ)にクロム。 –

+0

@TobbeBrolinこれは実装上の真実であろうと、[それはまだ仕様です](http://www.w3.org/TR/html5/webappapis.html#timers): "現在実行中のタスクがsetTimeout()メソッドによって作成され、タイムアウトが4未満の場合、タイムアウトを4に増やします。 – apsillers

+2

@TobbeBrolinしかし、私はWHATWGの仕様に反映されていることはわかりません。 W3CとWHATWGがこれに同意しないように見えます。 – apsillers

9

最新のブラウザでは、最低でも4ms(HTML5現在)ですが、その前には10msでした。これらの時間は決して100%正確ではないことに注意してください。

3

この記事は、Firefox、Safariの、オペラやプロットパフォーマンスグラフをテスト:

http://ejohn.org/blog/analyzing-timer-performance/

のFirefox 2、オペラ、およびSafariのすべてが遅れ

のための10msの下のウィンドウを持っています

古いブラウザでは、その記事のようなテストを行うことができます。私はちょうど前にIE6で10ms間隔を使用してsetIntervalのテストを実行しました。平均は55msです。 setTimeout35msにあるようです。

私はChromiumでテストを実行し、10msのタイムアウトに対して〜11msの平均を得ました。私は4msと1msの間隔でそれを試して、両方のため〜4.5msを得た。また、番号はオペレーティングシステムによって異なる可能性があります。

あなたが興味を持っている場合は、ここではテストコードです:

<script> 
// number of times to call setTimeout before calculating average 
var ITERATIONS = 200; 

window.onload = function() 
{ 
    testTimeout(10, +new Date, 0, 0); 
} 

// calls setTimeout repeatedly at a specified interval, tracking the amount 
// of time that passes between successive calls 
function testTimeout(interval, last, sum, ii) 
{ 
    var time = +new Date; 
    var difference = time - last; 
    sum += difference; 
    if (ii % ITERATIONS == 1) 
    { 
     document.body.innerHTML = sum/ITERATIONS; 
     sum = 0; 
    } 
    window.setTimeout(
     function() { 
      testTimeout(interval, time, sum, ii + 1) 
     }, interval); 
} 
</script> 
3

setTimeoutはおそらくsleep or Sleep system callを呼んでいます。

setTimeoutの最小量を含む実際のメカニックは、公式のECMA仕様にないため、プロプライエタリであるかシステムに依存します。それはあなたのJavascriptランタイムとそれを実行しているシステムによって異なります。Javascriptの実行時にオーバーヘッドが増えないため、オペレーティングシステムとハードウェアのタイムスライスの解像度によって最小のミリ秒が決定されます。 「スリープできる」最小時間は通常、プロセスが別のtimesliceをシステムのscheduling algorithmによって割り当てられるのにかかる時間です。 Windowsの(ポストXP)で

には、例えば、the documentation for the sleep system callは明らか:

ゼロの値は、スレッドが実行する準備ができ、他のスレッドにその タイムスライスの残りの部分を放棄する原因となります。 他のスレッドの実行準備ができていない場合、この関数はただちに戻り、 スレッドは実行を継続します。意味、あなたのJavascriptが実行時processを現在hardware threadに待機している他のプロセスが存在しない、いくつかの非常にまれな条件下で実行されている、それはあなたのJavascriptが実行時にどのように応じて、すぐに続ける場合があります

実装されています。あなたはおそらくそのような状態を非常に頻繁に観察することはありません:)

+1

本当の本当の答え – Pinal

+4

私はjavascirpt(主に)シングルスレッドのイベントベースの実行について知っていると思うものと一致しないので、この答えは私を納得させないことを認めなければなりません。任意のjs実装が「スリープ」を呼び出すという言及を指摘できますか? – Davide

+0

* Javascriptのランタイムの実装方法によってはすぐに処理が続行される可能性があります* * - ランタイムが正しく実装されている場合は、現在のコードの実行が終了するまでタイムアウトが実行されません。依然としてキューに入れられます。 – nnnnnn

関連する問題