浏览器计时器延迟 - 精确触发还是准时触发?
2023-09-26 09:37:42
现代浏览器中,当setTimeout或setInterval的回调函数在这两个函数回调中嵌套触发时(嵌套层数会有限制),会触发最少每4ms执行一次回调。在Chrome和Firefox中,第五次成功的回调将会被限制;Safari将会在第六次被限制;而Edge中将会在第三次就被限制;这是定时器的不准确性的表现吗?
为了更好地理解为什么定时器会有这种限制,我们必须了解实现定时器和理解浏览器中的事件循环机制,还要明白JavaScript是单线程运行的,在浏览器需要执行的JS代码执行完成后,才会执行UI渲染等过程,如果不断执行大量逻辑复杂或需要长时间执行的代码,会阻塞主线程,从而影响浏览器UI的正常响应。
要解决这个问题,就需要防止一个单一的任务长时间阻塞主线程,通常来说使用定时器定时任务(setTimeout、setInterval、requestAnimationFrame、postMessage等)是比较合适的,因为定时器是基于浏览器的事件循环机制,浏览器会将需要执行的事件添加至事件队列中,然后在合适的时候执行。
使用定时器可以很好地解决单线程执行带来的问题,但是定时器的执行本身是有延时的,也就是代码执行与预期的执行时间存在误差,导致不准确性,我们称之为“定时器延迟”。
那么,定时器延迟的最小值是多少呢?
在现代浏览器中,当setTimeout或setInterval的回调函数在这两个函数回调中嵌套触发时(嵌套层数会有限制),会触发最少每4ms执行一次回调。这是因为浏览器为了保证浏览器的响应速度和性能,会对定时器执行的频率进行限制,这也是为了防止定时器嵌套层数过多而导致浏览器崩溃。
在实践中,定时器延迟不仅取决于浏览器的限制,还受多个因素影响,包括:
- 浏览器的类型和版本:不同浏览器的定时器实现不同,导致延迟也有所不同。
- 操作系统的类型和版本:操作系统的性能和资源分配也会影响定时器延迟。
- 计算机的硬件配置:处理器的速度、内存大小等也会影响定时器延迟。
- 网络状况:如果网络延迟高,也会导致定时器延迟。
- 浏览器扩展和插件:某些浏览器扩展和插件可能会影响定时器延迟。
由于这些因素的影响,定时器延迟可能会有所不同,甚至可能超过4ms。因此,在使用定时器时,我们应该考虑到定时器延迟的可能性,并根据实际情况进行调整。
我们通常认为,浏览器实现定时器的最短时间间隔就是该定时器的最小延迟值,可以将其称为“最小延迟时间”。浏览器不会保证定时器能够完全精确地按照指定的间隔时间执行,而是允许存在一个最小延迟时间,在大多数情况下,定时器的延迟不会超过这个最小延迟时间。
所以,浏览器计时器延迟的原因是多方面的,既有浏览器的限制,也有其他因素的影响,我们需要根据实际情况进行调整,以便更好地使用定时器。