Firefox中的Javascript setinterval()延迟

Javascript setinterval() lag in Firefox?

本文关键字:延迟 setinterval 中的 Javascript Firefox      更新时间:2023-09-26

我已经写了这段代码,使秒(与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安装上工作,那么它可能只是一个孤立的问题,并且通过更改代码你无法做太多。