Firefox中的Javascript setinterval()延迟
Javascript setinterval() lag in Firefox?
我已经写了这段代码,使秒(与decisec &厘秒)计数。
You've wasted time <span id="alltime">0.00</span> seconds.
<script type="text/javascript">
function zeroPad(num,count)
{
var numZeropad = num + '';
while(numZeropad.length < count) { numZeropad = "0" + numZeropad; }
return numZeropad; }
function counttwo() {
tall = document.getElementById('alltime').innerHTML;
if(parseFloat(tall) < 1.00) { tnew2 = tall.replace('0.0','').replace('0.',''); }
else { tnew2 = tall.replace('.',''); }
tnum = parseInt(tnew2) + 1;
//check if have to add zero
if(tnum >= 100) { tstr1 = tnum + ''; }
else { tstr1 = zeroPad(tnum,3); }
tlast = tstr1.substr(0,tstr1.length - 2) + '.' + tstr1.substr(tstr1.length - 2);
document.getElementById("alltime").innerHTML = tlast;
}
var inttwo=setInterval("counttwo()",10);
</script>
在HTML文档中运行。
它工作得很好,但当我使用Firefox 4并运行代码时。当它在一些数字上(随机的,比如12.20,4.43)时,它似乎有点滞后(在计算之前停下来)。我试过把counttwo()改成counttwo,但是没用。
我告诉我的一些朋友也运行firefox4。他们说它一点也不滞后。这是因为我的电脑吗?还是我的火狐?还是别的?
提前感谢!
p。点击这里:http://jsfiddle.net/XvkGy/5/镜像:http://bit.ly/hjVtXS
当您使用setInterval或setTimeout时,由于几个原因,时间间隔不准确。它依赖于其他正在运行的javascript,浏览器,处理器等。您必须将+- 15ms的可靠性视为理所当然。
这是很多计数,所以在某些计算机上,是的,它可能会滞后(如果它是史前的一个或用户的处理器真的很忙),如果我是对的,那件事不会与Chrome的V8一起工作,因为如果你切换标签,脚本会冻结,只有当你返回标签时才恢复执行。
如果您只是经常看到暂停,那么您可能看到垃圾收集或循环收集暂停。
您可以通过在about:config
中将javascript.options.mem.log
的首选项设置为true,然后在脚本运行时查看错误控制台的"Messages"选项卡来测试这一点。如果GC/CC消息与您的暂停相关,那么它们就是您所看到的解释。
至于为什么你看到了,而其他人没有…如果禁用所有扩展,您会发现问题吗?
setInterval
的问题是它最终会导致备份。发生这种情况是因为JavaScript引擎试图在间隔(在您的情况下,10ms)上执行函数,但如果执行所需的时间超过10ms, JS引擎就会在当前间隔停止之前开始尝试执行下一个间隔(这实际上只是意味着它在前一个回调完成后将其排队运行)。
由于JavaScript执行单线程(HTML 5中的web工作者除外),这可能导致您的UI或DOM更新暂停,因为它不断处理来自setInterval
的JavaScript回调。在最坏的情况下,整个页面可能变得永久无响应,因为未完成的setInterval
执行堆栈变得越来越长,永远不会完全完成。
setTimeout
(并在执行回调后再次调用setTimeout
)而不是setInterval
是更安全的选择。使用setTimeout
,您可以确保一个且只有一个超时排队。而且由于定时器只是近似的(仅仅因为您指定了10ms并不意味着它将恰好发生在10ms),因此使用setInterval
而不是setTimeout
通常不会获得任何好处。
使用setTimeout
:
var count = function(){
// do something
// queue up execution once again
setTimeout(count, 10);
};
count();
你可能会在一些浏览器上看到暂停,而不是其他浏览器的一个原因是,并不是所有的JavaScript引擎都是一样的:)。有些比其他更快,因此,不太可能最终使用setInterval
备份。
不同的浏览器使用不同的JavaScript引擎,所以这段代码可能只是找到了Firefox JägerMonkey脚本引擎存在问题的地方。计数本身似乎没有任何明显的低效率。
如果它在你朋友的FF4安装上工作,那么它可能只是一个孤立的问题,并且通过更改代码你无法做太多。
- 如何在Javascript中延迟setInterval
- 如何更新setInterval延迟
- Javascript setInterval-速率或延迟
- 使用 setInterval 启动两个函数,并让它们立即启动,没有延迟
- 为什么javascript setTimeout延迟不起作用,setInterval太慢
- 带超时延迟的渐弱股票行情器(setTimeout内的setInterval)
- 屏幕休眠时的JavaScript setInterval延迟
- java script setInterval设置延迟时间
- 给setInterval或setTimeout传递一个分数延迟是否安全?
- 如何延迟setInterval - Java脚本
- 如何在setInterval循环中设置延迟
- setInterval()中的函数执行无延迟
- SetInterval函数不会在Javascript代码中创建延迟
- 在setInterval函数内部使用时,Jquery延迟是不一致的
- setInterval延迟不准确
- 是否有window.setInterval的最大延迟限制?
- 第一次执行setInterval函数时不要延迟
- setInterval:通过点击按钮改变延迟时出现故障
- jQuery setInterval从实时延迟
- 在setInterval()中暂停或延迟数组上的循环