在使用 javascript 时我注意到了这件事。你可以使用

var i=0;  
var startingTime=new Date().getTime(); 
setInterval("foo()",1); 
function foo() { 
    i+=1; 
    if ($("#foodiv").text()==i) { 
        //we detected a doubled value (parallel execution) 
        $("#repdiv").append("[repetition on "+i+"]"); 
    } 
    $("#foodiv").html(i); 
    $("#timediv").html(Math.floor((new Date().getTime()-startingTime)/1000)); 
} 

但是当我自己阅读和尝试时,时间不是 1ms,至少是 10ms 左右。事实上,10 秒后,我得到的值 i 约为 2300/2400,而不是预期的 10000。

这是程序的最小可能时间因素 ???当然没有。如果我试试这个:

<html><head> 
<script language="javascript" type="text/javascript" src="jquery-1.4.min.js"></script> 
<script type="text/javascript"> 
 
var i=0; 
var startingTime=new Date().getTime(); 
 
setInterval("foo()",1);setInterval("foo()",1);setInterval("foo()",1); 
setInterval("foo()",1);setInterval("foo()",1);setInterval("foo()",1); 
setInterval("foo()",1);setInterval("foo()",1);setInterval("foo()",1); 
setInterval("foo()",1);setInterval("foo()",1);setInterval("foo()",1); 
setInterval("foo()",1);setInterval("foo()",1);setInterval("foo()",1); 
setInterval("foo()",1);setInterval("foo()",1);setInterval("foo()",1); 
setInterval("foo()",1);setInterval("foo()",1);setInterval("foo()",1); 
setInterval("foo()",1);setInterval("foo()",1);setInterval("foo()",1); 
 
function foo() { 
    i+=1; 
    if ($("#foodiv").text()==i) { 
        //we detected a doubled value (parallel execution) 
        $("#repdiv").append("[repetition on "+i+"]"); 
    } 
    $("#foodiv").html(i); 
    $("#timediv").html(Math.floor((new Date().getTime()-startingTime)/1000)); 
 
} 
</script> 
</head> 
<body> 
<div id="foodiv"></div>  (counter) 
<br/> 
<div id="timediv"></div> (seconds passed) 
<br/> 
<div id="repdiv"></div> 
<br/> 
</body> 
</html> 

计数器会走得很快,10 秒后,我的值为 12000 !!!!。这对我来说是无法解释的,因为调用不是并行执行的(或者至少我们可以为不同的调用读取一些双倍的 i 值,计算在 repdiv div 中)。

有人能给我解释一下吗?我知道所有这些调用都会给 CPU 带来很大的压力,但至少它会以惊人的速度加快速度。

我阅读了您的所有回复和论坛中的其他问题,它们证实了我的想法。但真正的问题是为什么!为什么他们将限制设置为 15 毫秒,而我可以执行多个顺序调用以获得更短的时间?我确信这种多重回调系统不是好的做法,但我可以做到,而且我可能会使 CPU 负载饱和。

请您参考如下方法:

不,Javascript 是单线程的。当您运行 setIntervalsetTimeout 时,会生成一个事件,然后将其添加到浏览器的执行队列中。因此,虽然您不能保证代码本身会在您希望它运行时准确地运行,但您可以确定每次应该生成事件时都会生成事件。因此,在这种情况下,您有 12 个彼此非常接近的事件。我注意到您使用了 1 作为间隔值。但是,大多数浏览器中的最小值约为 15(有关更多信息,请参阅 here。)浏览器将按照事件在执行队列中的顺序(在 setInterval 中)运行事件,事件试图 catch 来。查看 Marcel 链接到的答案,了解更多详细信息)。

这意味着在第一个场景中,您每 15 毫秒左右生成一个 一个 事件。所以计数器增加得更慢。但在第二种情况下,您有 12 个事件,它们每 15 毫秒左右被触发一次,因此计数器递增得更快。


评论关闭
IT虾米网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!