setInterval延迟不准确
setInterval delays not accurate
我目前正在使用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调用一次interval。事实上,许多浏览器调用setInterval
的频率不会超过每5毫秒,有些甚至更长。另外,如果浏览器中发生了其他事件,并且有其他代码响应这些事件,那么setInterval()
调用可能会延迟更长时间。HTML5规范建议setTimeout()
的最短时间间隔为4ms, setInterval()
的最短时间间隔为10ms,但如果需要,允许实现者使用更长的最小时间。
实际上,如果你看一下这个定时器的规范草案,算法的第5步说:
如果timeout小于10,则将timeout增加为10。
第8步是这样写的:
可选,等待用户代理定义的时间长度。
并且,它包括这个注释:
允许用户代理根据需要填充超时优化设备的用电量。例如,一些处理器设置低功耗模式,减少计时器的粒度;在这样的平台、用户代理可以降低计时器的速度以适应这个时间表而不是要求处理器使用更精确的模式它与更高的功耗有关。
所有超时/间隔/调度功能都将运行得更慢。
这是计算机的本质,在操作系统中很常见,有许多事情需要CPU处理,并且作为实时系统太昂贵(而且不可能)。
如果你阅读他们的API https://developer.mozilla.org/en/docs/Web/API/window.setTimeout和https://developer.mozilla.org/en/docs/Web/API/window.setInterval,它说"经过指定的延迟"answers"每次调用之间的固定时间延迟"。他们不是说不"在特定的时间"也不是"在固定的时间"
- 在 JavaScript 中对音频文件进行计时不准确
- 谷歌地图API-缩小时默认标记不准确
- Socket.io 设置间隔不准确
- CreateJS的PreloadJS进度事件不准确
- kineticjs - 鼠标悬停不准确
- 如何使用 window.open 创建一个不确定延迟的弹出窗口(用于社交身份验证),而弹出窗口阻止程序会阻止它
- 将图像不可见地预加载到 DOM 中,而不会延迟页面加载
- 使用 javascript 库 draw2d 选择连接链接不准确
- 为什么在枚举属性/函数时键长度不准确
- JSON 字符串有效,但 JSON 数据不准确
- 计算何时多次写入文件会导致不准确
- 纹理帧缓冲区数据不准确
- Javascript减去数字是不准确的 - 为什么
- HTML5:矩形定位不准确
- 这 === 是否不适用于浮点舍入不准确的 b/c
- 碰撞检测在我的游戏中不准确
- setInterval上的计时;看起来不准确
- 与Async nodejs相关的问题-给出不准确的响应
- Promisejs不准确,$getJSON在循环中
- setInterval延迟不准确