web-dev-qa-db-ja.com

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

置きたい

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

javaScriptでコールバック関数を実装するときのこのコード。

しかし、最新のブラウザーといくつかの古いブラウザーが見つかりました

異なる最小タイムアウト値があります。

ゼロを最小値にすることはできません。

setTimeoutの最小値は何ですか

互換性の問題のための最新のブラウザといくつかの古いブラウザ?

43
InspiredJW

私は多くのコードを使用しているのを見たので、10はすべてのブラウザーで最も信頼できる最小値になると思います。

ただし、 HTML5の最小値は4ミリ秒

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

43
Martin.

最新のブラウザでは、最小値は(HTML5の時点で)4ミリ秒で、それ以前は10ミリ秒でした。これらの時間は100%正確ではないことに注意してください。

9
Madara Uchiha

この記事では、Firefox、Safari、およびOperaをテストし、パフォーマンスグラフをプロットします。

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

Firefox 2、Opera、Safariにはすべて、遅延のために10ミリ秒の下部ウィンドウがあります

古いブラウザの場合、その記事のようなテストを実行できます。 IE6で10ミリ秒間隔を使用して、しばらく前からsetIntervalのテストを実行しましたが、平均55mssetTimeout35msで低いようです。

Chromiumでテストを実行し、10ミリ秒のタイムアウトで〜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
Devourant

setTimeoutは、おそらく sleepまたはSleepシステムコール を呼び出しています。

setTimeoutの最小ミリ秒を含む実際のメカニズムは、公式のECMA仕様に含まれていないため、プロプライエタリであるかシステムに依存しています。 Javascriptランタイムと、それを実行しているシステムによって異なります。 Javascriptランタイムがオーバーヘッドを大幅に追加することはないため、最小ミリ秒数はオペレーティングシステムとハードウェアのタイムスライス解像度によって決まります。最小の「スリープ可能」時間は、通常、プロセスに別の timeslice がシステムの スケジューリングアルゴリズム によって割り当てられるのにかかる時間です。

たとえば、Windows(XP以降)では、 スリープシステムコールのドキュメント は以下を明らかにします。

値がゼロの場合、スレッドは、そのタイムスライスの残りを、実行可能な他のスレッドに放棄します。実行可能なスレッドが他にない場合、関数はすぐに戻り、スレッドは実行を継続します。

つまり、Javascriptランタイム プロセス が実行されている ハードウェアスレッド で現在待機している他のプロセスがない、非常にまれな状況では、すぐに続行する可能性がありますJavascriptランタイムの実装方法に応じて、呼び出し元の実行が終了した後。あなたはおそらくそのような状態を非常に頻繁に観察しないでしょう:)

3
Domi