setInterval延迟不准确

我目前正在使用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的间隔调用您的间隔。 实际上,许多浏览器永远不会比每5ms更频繁地调用setInterval ,有些甚至更长。 另外,如果浏览器中发生任何其他事件并且其他代码响应这些事件,则setInterval()调用可能会延迟更长时间。 HTML5规范建议将4ms作为setTimeout()的最短间隔,将10ms作为setInterval()的最短间隔,但允许实现者在需要时使用更长的最小时间。

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

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

而且,第8步说:

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

并且,它包括这个说明:

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

除了运行速度之外,所有超时/间隔/调度function都是例外。

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

如果您阅读他们的API https://developer.mozilla.org/en/docs/Web/API/window.setTimeout和https://developer.mozilla.org/en/docs/Web/API/window.setInterval ,它说“在指定的延迟后”和“每次通话之间的固定时间延迟”。 他们并不是说“在特定的时间”也不是“在固定时期召唤”