2014-10-11 25 views
0

最近,当我一个解决问题的算法,我发现了一个普通的大for循环这样大的for循环挂起JavaScript引擎

var x = 1000000000000; 
for (var i = 0; i <= x; i++) {} 

可以挂JavaScript引擎(TESTD上的Node.js,Chrome浏览器和Firefox的JavaScript安慰)。

其实它正在运行,但非常慢。我尝试了x的几个值,并且当x = 1000000时有明显的延迟。

这种性能是否与解释语言正常?

+0

在Node中运行良好。没有挂。 – elclanrs 2014-10-11 07:05:18

+1

当循环执行如此大量的迭代时,系统肯定会挂起,无论您使用的是什么语言。然而,大多数解释器甚至不会尝试运行你的循环,因为在循环之后'i'永远不会被使用,并且循环什么也不做。 – 2014-10-11 08:09:34

+1

你预计会发生什么?浏览器不会执行先发制人的多任务处理。引擎不是“悬挂”,而是“思考”。 – 2014-10-11 08:38:15

回答

2

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

该行为不局限于解释型语言。循环总是会持续很长时间。例如在c#中尝试使用for (long n = 1000000000000; n >= 0; n-=1) {}

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

+0

您复制了我的链接;) – Peter 2014-10-13 06:00:58

2

这在任何语言中都会很慢。在这种情况下,它特别明显,因为它阻止了你的用户界面。 JavaScript引擎执行单线程事件循环。您始终可以使用use web workers在后台执行缓慢的处理任务。