Firefox中的Javascript setinterval()滞后?

时间:2011-04-26 14:52:32

标签: javascript firefox setinterval lag

我已经编写了这段代码,以秒(使用decisec& centisec)计数。

    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并运行代码时。看起来有点像LAG(在计数之前停一下)当它在一些数字上时(随机像12.20,4.43)。我已经尝试过更改“counttwo()”来计算,但这没有用。

我告诉我的一些朋友也要在Firefox 4上运行。他们说它根本没有滞后。这是因为我的电脑?还是我的火狐?或其他什么?

提前致谢!

PS。在这里小提琴:http://jsfiddle.net/XvkGy/5/镜子:http://bit.ly/hjVtXS

5 个答案:

答案 0 :(得分:2)

当您使用setInterval或setTimeout时,由于多种原因,时间间隔不准确。它依赖于其他javascript运行,浏览器,处理器等。你必须采取+ - 15ms的可靠性为理所当然afaik。 See also ...

答案 1 :(得分:1)

这是很多计算,所以在某些计算机上,是的,它可能会滞后(如果它是史前的或用户让他的处理器真的忙于某事),如果我是对的,那东西也行不通使用Chrome的V8,因为如果您切换标签,该脚本将冻结,并且只有当您返回该标签时才会继续执行。

答案 2 :(得分:1)

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备份。

答案 3 :(得分:1)

如果你经常看到暂停,你可能会看到垃圾收集或循环收集暂停。

您可以在javascript.options.mem.log中将about:config首选项切换为true,然后在脚本运行时查看错误控制台的“消息”标签,从而对此进行测试。如果GC / CC消息与您的暂停相关联,那么它们就是您所看到的内容的解释。

至于为什么你会看到它,但是其他人没有......如果你禁用所有扩展程序,你会发现问题吗?

答案 4 :(得分:0)

不同的浏览器使用不同的JavaScript引擎,因此这段代码可能只是找到了Firefox的JägerMonkey脚本引擎存在问题的地方。计数本身似乎没有任何明显的低效率。

如果它正在为你朋友安装的FF4工作,那么对你来说这可能只是一个孤立的问题,你可以通过改变代码来做很多事情。