miz*_*zar 5 javascript multithreading setinterval
在使用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));
}
Run Code Online (Sandbox Code Playgroud)
但是当我阅读并尝试自己时,时间不是1毫秒,它至少是10毫秒或者其他东西.实际上10秒后,我的值大约为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>
Run Code Online (Sandbox Code Playgroud)
计数器将非常快,10秒后,我的值为12000 !!!! 这对我来说是无法解释的,因为调用不是并行执行的(或者至少我们可以为不同的调用获得一些加倍的i的readed值,在repdiv div中计算).
有人可以解释一下吗?我知道所有这些电话都非常强调cpu,但至少它会令人惊讶地加快速度.
我在论坛中阅读了你的所有回复和其他任务,他们证实了我的想法.但真正的问题是为什么!当我可以进行多次连续调用以获得更低的时间时,为什么他们将限制设置为15ms?我敢肯定这个多回调系统不是好习惯,但我可以做到,而且我可能会使cpu负载饱和.
不,Javascript是单线程的.当您运行setIntervalor时setTimeout,会生成一个事件,然后将其添加到浏览器的执行队列中.因此,虽然您无法保证代码本身将在您希望它运行时完全运行,但您可以确保每次生成事件时都会生成该事件.因此,在这种情况下,您生成的12个事件彼此非常接近.我注意到你用作1间隔值.但是,大多数浏览器中的最小值都在附近15(有关详细信息,请参阅此处.)浏览器将按照它们在执行队列中的顺序运行事件(在setInterval事件中,事件会尝试追赶.请查看答案马塞尔联系到了,更多细节).
这意味着在第一种情况下,您每15秒左右生成一个事件.因此计数器增加得更慢.但是在第二种情况下,你有十二个事件每隔15毫秒就会相互接近,因此计数器的增加速度要快得多.
在大多数浏览器中,JavaScript 计时器值至少设置为 15 毫秒,即使给出的值更小。据我所知,只有 Google Chrome 使用 4ms。另请参阅如何确定在 JavaScript 动画循环中使用的最佳“帧速率”(setInterval 延迟)?。