我目前正在使用setInterval创建一个倒计时,虽然它运行速度比应该慢。根据{{3}},延迟参数以毫秒为单位,但不准确。
我将倒计时与手机上的倒计时进行了比较,手机的运行速度提高了近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对象元素。
我所得到的是,是否有理由让它运行速度慢于预期?
答案 0 :(得分:1)
setInterval()
无法保证在javascript中按时完美运行。这部分是因为JS是单线程的,部分原因是其他原因。如果要显示setInterval()
的时间,则在每个计时器滴答时获取当前时间并显示该时间。 setInterval()
不是您的计时器,而只是一个重复出现的屏幕更新机制。如果你这样做的话,你的时间显示总是准确的。
此外,没有浏览器会保证以1ms的间隔调用您的间隔。事实上,许多浏览器永远不会比每5毫秒更频繁地调用setInterval
,有些甚至更长。此外,如果浏览器中发生任何其他事件并且其他代码响应这些事件,则setInterval()
呼叫可能会延迟更长时间。 HTML5规范提出4ms作为setTimeout()
的最短间隔,10ms作为setInterval()
的最短间隔,但允许实现者在需要时使用更长的最小时间。
事实上,如果你看一下this draft spec for timers,算法的第5步说:
如果超时小于10,则将超时增加到10。
而且,第8步说:
(可选)等待用户代理定义的另一段时间。
并且,它包括这个注释:
这是为了允许用户代理根据需要填充超时 优化设备的电源使用。例如,一些处理器 具有低功耗模式,其中定时器的粒度减小;上 在这样的平台上,用户代理可以减慢定时器的速度以适应这种安排 而不是要求处理器使用更准确的模式 其相关的更高功率使用。
答案 1 :(得分:1)
所有超时/间隔/计划功能除外,运行速度较慢。
这是计算机的本质,在操作系统中很常见,CPU需要处理许多事情,而且作为实时系统的成本太高(而且不可能)。
如果您阅读了他们的API https://developer.mozilla.org/en/docs/Web/API/window.setTimeout和https://developer.mozilla.org/en/docs/Web/API/window.setInterval,那么它会说明"在指定的延迟后#34;和#34;每次通话之间的固定时间延迟"。他们并没有在指定时间内没有说""也没有"在固定时期召唤"