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 );
这是我脚本的主要部分。 变量hours
, minutes
, seconds
和milliseconds
是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 ,它说“在指定的延迟后”和“每次通话之间的固定时间延迟”。 他们并不是说“在特定的时间”也不是“在固定时期召唤”