2014-10-11 77 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在後臺執行緩慢的處理任務。