资讯专栏INFORMATION COLUMN

无奈之延时函数的误差

cnsworder / 3218人阅读

摘要:延时函数的不准确性浏览器时钟精度浏览器的时钟精度就是浏览器更新时钟的频率。延时函数的不准确性在人类的眼中或许感觉不到和存在误差,毕竟级的时间太短暂了。我们先设置了这样一个延时处理的函数,函数被添加到队列当中,预计之后执行。

延时函数的不准确性 浏览器时钟精度

浏览器的时钟精度就是浏览器更新时钟的频率。更新的越频繁,那么时间也就越准确。

现在浏览器的最小精度为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()在微世界中,其实并不守时,这是无法控制且无奈的事情。

从上面可以看出,浏览器的精度越小,那么误差也就越小。嗯 ~ ~ 排队时间无法预算,只能求老天保佑了。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/86479.html

相关文章

  • Nature重磅:Hinton、LeCun、Bengio三巨头权威科普深度学习

    摘要:机器学习系统被用来识别图像中的物体将语音转为文本,根据用户兴趣自动匹配新闻消息或产品,挑选相关搜索结果。而深度学习的出现,让这些问题的解决迈出了至关重要的步伐。这就是深度学习的重要优势。 借助深度学习,多处理层组成的计算模型可通过多层抽象来学习数据表征( representations)。这些方法显著推动了语音识别、视觉识别、目标检测以及许多其他领域(比如,药物发现以及基因组学)的技术发展。...

    GT 评论0 收藏0
  • 【Step-By-Step】一周面试题深入解析 / 周刊 03

    摘要:禁止内联脚本执行规则较严格,目前发现使用。合理使用上报可以及时发现,利于尽快修复问题。因为事件会从目标元素一层层冒泡至对象。允许给一个事件注册多个监听。表示在捕获阶段触发,表示在冒泡阶段触发。 关于【Step-By-Step】 Step-By-Step (点击进入项目) 是我于 2019-05-20 开始的一个项目,每个工作日发布一道面试题。每个周末我会仔细阅读大家的答案,整理最一份...

    hedge_hog 评论0 收藏0

发表评论

0条评论

cnsworder

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<