什么是setTimeout的最小毫秒值?

我想说

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

这段代码当我用JavaScript实现callback函数。

但是我发现现代的浏览器和一些旧的浏览器

有不同的最小超时值。

我知道零不能是最小值。

setTimeout的最小值是多less?

现代的浏览器和一些旧的浏览器兼容性问题?

我认为10将是所有浏览器中最可靠的最小值,因为我已经看到很多使用它的代码。

不过, 4ms是HTML5的最低限度

实际上,4ms是由HTML5规范指定的,并且在2010年及以后发布的浏览器中保持一致。 在(Firefox 5.0 / Thunderbird 5.0 / SeaMonkey 2.2)之前,嵌套超时的最小超时值为10毫秒。

现代浏览器中的最小值为4ms(截止到HTML5),在此之前是10ms。 请注意,这些时间从来不是100%准确的。

setTimeout很可能是调用sleepSleep系统调用 。

setTimeout的实际机制(包括最小毫秒数)是专有和/或系统相关的,因为它们不在ECMA官方规范中。 这取决于你的Javascript运行时间,以及你正在运行的系统。 鉴于,您的Javascript运行时不会增加大量的开销,毫秒的最小量是由操作系统和硬件的时间片分辨率决定的。 最小的“可睡”时间量通常是系统调度algorithm为进程分配另一时间片所花费的时间 。

例如,在Windows(后XP)上, 睡眠系统调用的文档显示:

值为零将导致线程放弃其时间片的其余部分到准备运行的任何其他线程。 如果没有其他线程准备运行,则该函数立即返回,线程继续执行。

这意味着,在一些非常罕见的情况下,当前没有其他进程正在等待您的Javascript运行时进程正在运行的硬件线程上,它可能会立即继续,这取决于您的Javascript运行时间是如何实现的。 你可能不会经常观察这种情况,虽然:)

本文testingFirefox,Safari和Opera并绘制性能图:

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

Firefox 2,Opera和Safari都有一个延迟10ms的底部窗口

对于旧版本的浏览器,您可以按照该文章中的方法进行testing。 我刚刚在IE6上运行了一个我在setInterval使用10ms间隔的testing,平均时间是55mssetTimeout35ms似乎更低。

我在Chromium中进行了testing,在10ms超时时间内平均达到了11ms 。 我用4ms和1ms的时间间隔试了一次,两者都达到了〜4.5ms 。 另外,请记住,这些数字可能因操作系统而异。

如果你有兴趣,这里是testing代码:

 <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>