无法之延时函数的偏差

延时函数的不正确性

浏览器时钟精度

浏览器的时钟精度就是浏览器更新时钟的频次。更新的越频仍,那末时刻也就越正确。

如今浏览器的最小精度为4ms,但并不意味着频次时刻保持在4ms。仔细分析一下,“更新操纵”对电脑来说是比较烧脑的,头脑轻微差点的cpu回响反映慢,精度就低。事实上,除了cpu硬件以外,操纵系统(OSX和windows下差别)以及浏览器内核都邑影响到浏览器的精度;其次,电脑自身的调治机制,尤其是笔记本。笔记本在运用电池供电的时刻,精度就会被自动下降从而到达庇护电源的作用。所以最小精度4ms只是现今浏览器的最高程度,显现情况下是不会到达这一精度。

延时函数的不正确性

在人类的眼中也许觉得不到setTimeout()和setInterval()存在偏差,毕竟ms级的时刻太短暂了。但事实上确切存在着偏差。下面来说偏差从何而来。

setTimeout(fn,15ms);

我们先设置了如许一个延时处置惩罚的函数,fn函数被添加到行列当中,估计15ms以后实行。
过去的浏览器时刻精度在10ms~15.6ms之间已是极限了,那末我们就假定我们运用的浏览器的时刻精度为10ms。

函数守候时刻    |--------------| 15ms
浏览器革新      |--------||----------| 20ms
  

当第一个10ms以后,浏览器革新了时刻,发明“我靠,跑了这么久,还没有到点”,因而又发起第二次革新。第二次革新完毕以后,20ms已过去了,函数才到了实行期,而且比预期要多等了5ms。

我们晓得,浏览器实行js和更新界面是共用一个线程的,当线程空闲时,它会从使命行列中取使命来运转。所以当函数到了实行期时,它会被添加到行列当中,然则不一定马上实行,假如行列中另有其他使命,单线程的划定规矩就会致使这个函数须要守候前面的使命实行完才能够实行。

基于这两点缘由,setTimeout()和setInteval()在微天下中,实在并不守时,这是没法控制且没法的事变。

从上面能够看出,浏览器的精度越小,那末偏差也就越小。嗯 ~ ~ 列队时刻没法预算,只能求老天保佑了。

    原文作者:wujer
    原文地址: https://segmentfault.com/a/1190000006115790
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞