setInterval延迟不准确

时间:2014-06-01 15:25:51

标签: javascript jquery setinterval

我目前正在使用setInterval创建一个倒计时,虽然它运行速度比应该慢。根据{{​​3}},延迟参数以毫秒为单位,但不准确。

我将倒计时与手机上的倒计时进行了比较,手机的运行速度提高了近5倍。

    var count = setInterval( function() {
            if (iMil == 0) {
                if (iS == 0) {
                    if (iMin == 0) {
                        if (iH == 0) {
                            // DONE
                        } else {
                            iH--;
                            iMin = 59;
                            iS = 59;
                            iMil = 999;
                        }
                    } else {
                        iMin--;
                        iS = 59;
                        iMil == 999;
                    }
                } else {
                    iS--;
                    iMil = 999;
                }
            } else {
                iMil--;
            }
            hours.text(iH);
            minutes.text(iMin);
            seconds.text(iS);
            milliseconds.text(iMil);
        }, 1 );

这是我脚本的主要部分。变量hoursminutessecondsmilliseconds是jQuery对象元素。

我所得到的是,是否有理由让它运行速度慢于预期?

2 个答案:

答案 0 :(得分:1)

setInterval()无法保证在javascript中按时完美运行。这部分是因为JS是单线程的,部分原因是其他原因。如果要显示setInterval()的时间,则在每个计时器滴答时获取当前时间并显示该时间。 setInterval()不是您的计时器,而只是一个重复出现的屏幕更新机制。如果你这样做的话,你的时间显示总是准确的。

此外,没有浏览器会保证以1ms的间隔调用您的间隔。事实上,许多浏览器永远不会比每5毫秒更频繁地调用setInterval,有些甚至更长。此外,如果浏览器中发生任何其他事件并且其他代码响应这些事件,则setInterval()呼叫可能会延迟更长时间。 HTML5规范提出4ms作为setTimeout()的最短间隔,10ms作为setInterval()的最短间隔,但允许实现者在需要时使用更长的最小时间。

事实上,如果你看一下this draft spec for timers,算法的第5步说:

  

如果超时小于10,则将超时增加到10。

而且,第8步说:

  

(可选)等待用户代理定义的另一段时间。

并且,它包括这个注释:

  

这是为了允许用户代理根据需要填充超时   优化设备的电源使用。例如,一些处理器   具有低功耗模式,其中定时器的粒度减小;上   在这样的平台上,用户代理可以减慢定时器的速度以适应这种安排   而不是要求处理器使用更准确的模式   其相关的更高功率使用。

答案 1 :(得分:1)

所有超时/间隔/计划功能除外,运行速度较慢。

这是计算机的本质,在操作系统中很常见,CPU需要处理许多事情,而且作为实时系统的成本太高(而且不可能)。

如果您阅读了他们的API https://developer.mozilla.org/en/docs/Web/API/window.setTimeouthttps://developer.mozilla.org/en/docs/Web/API/window.setInterval,那么它会说明"在指定的延迟后#34;和#34;每次通话之间的固定时间延迟"。他们并没有在指定时间内没有说""也没有"在固定时期召唤"