Firefox中的Javascript setinterval()延迟?

Firefox中的Javascript setinterval()延迟?,javascript,firefox,setinterval,lag,Javascript,Firefox,Setinterval,Lag,我写这段代码是为了让秒(分秒和厘米秒)计数 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)

我写这段代码是为了让秒(分秒和厘米秒)计数

    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>
您浪费了0.00秒的时间。
函数zeroPad(num,count)
{
var numZeropad=num+'';
而(numZeropad.length=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);
在HTML文档中运行

它工作得很好,但当我使用Firefox4并运行代码时。当它出现在一些数字上(随机的像12.20,4.43)时,它似乎有点滞后(停止一点再计数)。我试着将“counttwo()”改为counttwo,但没有用

我已经告诉我的一些朋友也在Firefox4上运行。他们说它一点也不滞后。这是因为我的电脑?还是我的Firefox?还是别的什么

提前谢谢


PS.Fiddle here:Mirror:

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


如果你的朋友安装了FF4,那么这对你来说可能只是一个孤立的问题,通过更改代码,你将无能为力。

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


如果它在你朋友安装的FF4上工作,那么对你来说这可能只是一个孤立的问题,而且通过更改代码你也做不了什么。

这需要大量计算,所以在某些计算机上,是的,它可能会滞后(如果它是史前的,或者用户的处理器真的很忙),如果我是对的,这个东西在Chrome的V8上不起作用,因为如果你切换选项卡,脚本会冻结,只有当你返回到该选项卡时才能继续执行。

这是一个很大的计数,所以在某些计算机上,是的,它可能会延迟(如果是史前的,或者用户的处理器真的很忙),如果我是对的,这一点在Chrome的V8中不起作用,因为如果切换选项卡,脚本将冻结,并且只有在返回到该选项卡时才恢复执行。

当使用setInterval或setTimeout时,时间间隔不准确,原因有几个。它依赖于运行的其他javascript、浏览器、处理器等。您必须将+-15ms的可靠性视为理所当然的afaik

使用setInterval或setTimeout时,时间间隔不准确,原因有几个。它依赖于运行的其他javascript、浏览器、处理器等。您必须将+-15ms的可靠性视为理所当然的afaik

设置间隔的问题在于它最终可能导致备份。这是因为JavaScript引擎尝试在间隔时间(在您的例子中为10ms)上执行函数,但如果执行时间超过10ms,JS引擎将在当前间隔停止之前开始尝试执行下一个间隔(这实际上只是意味着它将在上一次回调结束时将其排队运行)

由于JavaScript执行单线程(HTML 5中的web workers除外),这可能导致UI或DOM更新暂停,因为它正在不断处理来自
setInterval
的JavaScript回调。在最坏的情况下,整个页面可能会永久无响应,因为未完成的
setInterval
执行堆栈越来越长,永远不会完全完成

除了少数例外,通常认为使用
setTimeout
(并在执行回调后再次调用
setTimeout
)而不是
setInterval
更安全。使用
setTimeout
,您可以确保只有一个超时被排队。而且,由于计时器只是近似值(仅因为您指定10ms并不意味着它将恰好发生在10ms),因此通常使用
setInterval
over
setTimeout
不会获得任何好处

使用
setTimeout
的示例:

var count = function(){
    // do something

    // queue up execution once again
    setTimeout(count, 10);
};

count();

您可能会在某些浏览器(而不是其他浏览器)上看到暂停的一个原因是,并非所有JavaScript引擎都创建为相同的:)。有些备份速度比其他备份快,因此不太可能以
setInterval
备份结束。

setInterval的问题是,它最终可能导致备份。这是因为JavaScript引擎尝试在间隔时间(在您的例子中为10ms)上执行函数,但如果执行时间超过10ms,JS引擎将在当前间隔停止之前开始尝试执行下一个间隔(这实际上只是意味着它将在上一次回调结束时将其排队运行)

由于JavaScript执行单线程(HTML 5中的web workers除外),这可能导致UI或DOM更新暂停,因为它正在不断处理来自
setInterval
的JavaScript回调。在最坏的情况下,整个页面可能会永久无响应,因为未完成的
setInterval
执行堆栈越来越长,永远不会完全完成

除了少数例外,它是