gpt4 book ai didi

javascript - setInterval 的这种行为是否意味着 Javascript 中的多线程行为?

转载 作者:数据小太阳 更新时间:2023-10-29 05:51:01 24 4
gpt4 key购买 nike

在使用 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 毫秒左右被触发一次,因此计数器递增得更快。

关于javascript - setInterval 的这种行为是否意味着 Javascript 中的多线程行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4037738/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com