Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
大for循环挂起javascript引擎_Javascript_Node.js_Google Chrome_Firefox_For Loop - Fatal编程技术网

大for循环挂起javascript引擎

大for循环挂起javascript引擎,javascript,node.js,google-chrome,firefox,for-loop,Javascript,Node.js,Google Chrome,Firefox,For Loop,最近当我在解决一个算法问题时,我发现了一个简单的大for循环,就像这样 var x = 1000000000000; for (var i = 0; i <= x; i++) {} var x=1000000000000; 对于(var i=0;i,您可以使用某种形式的,将循环分解为块,例如,使用或使用所描述的机制 该行为并不局限于解释语言。循环将始终持续很长到很长时间。例如,在c#中尝试for(long n=10000000000;n>=0;n-=1){} 最后,在(现代)浏览器中使用

最近当我在解决一个算法问题时,我发现了一个简单的大for循环,就像这样

var x = 1000000000000;
for (var i = 0; i <= x; i++) {}
var x=1000000000000;
对于(var i=0;i,您可以使用某种形式的,将循环分解为块,例如,使用或使用所描述的机制

该行为并不局限于解释语言。循环将始终持续很长到很长时间。例如,在c#中尝试
for(long n=10000000000;n>=0;n-=1){}

最后,在(现代)浏览器中使用可能是可行的。以下是我为另一个SO问题创建的。

您可以使用某种形式的,将循环分解为块,例如使用或使用所述的机制

该行为并不局限于解释语言。循环将始终持续很长到很长时间。例如,在c#中尝试
for(long n=10000000000;n>=0;n-=1){}


最后,在一个(现代)使用浏览器可能是可行的。这是我为另一个SO问题创建的。

这在任何语言中都会很慢。在这种情况下尤其明显,因为它会阻塞您的UI。JavaScript引擎执行单线程事件循环。您可以始终在后台执行缓慢的处理任务。

这在任何语言中都会很慢uage。在这种情况下,这一点尤其明显,因为它会阻塞您的UI。JavaScript引擎执行单线程事件循环。您可以随时在后台执行缓慢的处理任务。

在现实情况下,这不应该是一个问题,我在MacBook Pro笔记本电脑上进行了测试:

  • 1000000次循环迭代
  • 每个迭代调用一个(简单)函数
  • 前几轮需要2-3毫秒(冷编译器)
  • 之后需要约0.5毫秒(编译器优化热代码)
如果您需要迭代超超大型值,我会将其拆分为更小的垃圾,并使用
setTimeout
requestAnimationFrame
将工作负载分散到不同的帧上,而不会导致任何帧丢失(帧有~16ms的时间完成所有工作)

console.clear();
//选择权
const start=true;
const useFastTick=false;//每刻度3ms,例如1s
const interval=1;//1:一次/秒、2:两次/秒等
常量迭代次数=1000000;
函数emptyFn(){}
函数argsFn(obj){}
函数emptyFns(){
for(设i=0;irequestAnimationFrame(勾号),1000*间隔);
}
}
如果(开始)请求动画帧(勾选);
//将结果记录到控制台
函数日志(全部、空、参数){
console.group(`${all}ms`);
log(`Empty:${Empty}ms`);
log(`Arrgs:${args}ms`);
console.groupEnd();

}
现实世界的案例应该不会有问题,我在MacBook Pro笔记本电脑上进行了测试:

  • 1000000次循环迭代
  • 每个迭代调用一个(简单)函数
  • 前几轮需要2-3毫秒(冷编译器)
  • 之后需要约0.5毫秒(编译器优化热代码)
如果您需要迭代超超大型值,我会将其拆分为更小的垃圾,并使用
setTimeout
requestAnimationFrame
将工作负载分散到不同的帧上,而不会导致任何帧丢失(帧有~16ms的时间完成所有工作)

console.clear();
//选择权
const start=true;
const useFastTick=false;//每刻度3ms,例如1s
const interval=1;//1:一次/秒、2:两次/秒等
常量迭代次数=1000000;
函数emptyFn(){}
函数argsFn(obj){}
函数emptyFns(){
for(设i=0;irequestAnimationFrame(勾号),1000*间隔);
}
}
如果(开始)请求动画帧(勾选);
//将结果记录到控制台
函数日志(全部、空、参数){
console.group(`${all}ms`);
log(`Empty:${Empty}ms`);
log(`Arrgs:${args}ms`);
console.groupEnd();

}
在Node中运行良好。无挂起。当循环进行如此大量的迭代时,系统肯定会挂起,无论您使用的是什么语言。但是,大多数解释器甚至不会尝试运行您的循环,因为在循环之后从未使用过
i
,循环什么也不做。您期望发生什么?browser不做先发制人的多任务。引擎不是“挂起”,而是“思考”。谢谢你们,现在我对循环有了认识——这对任何语言来说都是一项耗时的任务。在Node中运行良好。无挂起。当循环进行如此大量的迭代时,系统肯定会挂起,无论您使用的是哪种语言。然而,大多数解释器甚至不会尝试运行您的循环,因为
I
在循环之后从不使用,循环什么也不做。您希望发生什么?浏览器不做预em