setInterval延迟不准确

setInterval delays not accurate

本文关键字:不准确 延迟 setInterval      更新时间:2023-09-26

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

我把我的倒计时和我手机上的相比,手机快了将近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对象元素。

我想说的是,是不是有一个原因,它运行得比它应该慢?

setInterval()不能保证在javascript中完全准时运行。这部分是因为JS是单线程的,部分是因为其他原因。如果你想用setInterval()显示时间,那么获取每个计时器刻度上的当前时间并显示它。setInterval()不会是你的计时器,而只是一个循环的屏幕更新机制。如果你这样做,你的时间显示将永远是准确的。

此外,没有浏览器会保证每隔1ms调用一次interval。事实上,许多浏览器调用setInterval的频率不会超过每5毫秒,有些甚至更长。另外,如果浏览器中发生了其他事件,并且有其他代码响应这些事件,那么setInterval()调用可能会延迟更长时间。HTML5规范建议setTimeout()的最短时间间隔为4ms, setInterval()的最短时间间隔为10ms,但如果需要,允许实现者使用更长的最小时间。

实际上,如果你看一下这个定时器的规范草案,算法的第5步说:

如果timeout小于10,则将timeout增加为10。

第8步是这样写的:

可选,等待用户代理定义的时间长度。

并且,它包括这个注释:

允许用户代理根据需要填充超时优化设备的用电量。例如,一些处理器设置低功耗模式,减少计时器的粒度;在这样的平台、用户代理可以降低计时器的速度以适应这个时间表而不是要求处理器使用更精确的模式它与更高的功耗有关。

所有超时/间隔/调度功能都将运行得更慢。

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

如果你阅读他们的API https://developer.mozilla.org/en/docs/Web/API/window.setTimeout和https://developer.mozilla.org/en/docs/Web/API/window.setInterval,它说"经过指定的延迟"answers"每次调用之间的固定时间延迟"。他们不是说不"在特定的时间"也不是"在固定的时间"