setTimeout的最小毫秒值是多少?

时间:2012-03-10 14:29:54

标签: javascript timer cross-browser settimeout

我想提出

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

当我用JavaScript实现回调函数时,这段代码。

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

具有不同的最小超时值。

我知道零不能是最小值。

的setTimeout最小值是多少?

现代浏览器和一些旧浏览器是否存在兼容性问题?

4 个答案:

答案 0 :(得分:43)

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

然而,4ms is the minimum for HTML5

  

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

答案 1 :(得分:9)

在现代浏览器中,最小值是4ms(从HTML5开始),在此之前,它是10ms。请注意,这些时间永远不会100%准确。

答案 2 :(得分:3)

本文测试Firefox,Safari和Opera并绘制性能图:

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

  

Firefox 2,Opera和Safari都有一个10毫秒的延迟窗口

对于旧版浏览器,您可以像该文章中那样进行测试。我刚刚在IE6中使用10分钟的间隔运行了setInterval前一段时间的测试,我的平均值 55ms 35ms setTimeout似乎更低。

我在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 :(得分:3)

setTimeout最有可能调用sleep or Sleep system call

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

在Windows(XP后)上,the documentation for the sleep system call显示:

  

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

这意味着,在一些非常罕见的情况下,当前没有其他进程在hardware thread上等待您的Javascript运行时process正在运行,它可能会在调用者完成后立即继续执行,具体取决于您的Javascript运行时的实现方式。你可能不会经常观察到这种情况:)