2011-05-12 31 views
2

有沒有優化此循環的JS編譯器?我應該相信現代瀏覽器爲我優化代碼嗎?

for (var i = fromIndex; i < arr.length; i++) { ...} 

在這種criticism against Google Closure,它是說,一個更好的循環將是

for (var i = fromIndex, ii = arr.length; i < ii; i++) { 

在我知道所有其他語言,我相信編譯器爲我做這些事情。我懷疑Google Chrome和現代瀏覽器會進行這些優化......我錯了嗎?

該文章中還有更多的例子,比如長開關的情況下性能很差。現在Chrome和FF 4.0的情況仍然如此(我聽到有關IE 9的好消息)?

+0

我不會太在意有關效率的東西,他會在庫中寫下類似'function(a,b ,c){var d = a * y.cos(c)-b * y.sin(c),e = a * y.sin(c)+ b * y.cos(c); return {x:d ,Y:電子}}' – 6502 2011-05-12 21:56:38

回答

0

大多數瀏覽器應該優化這種東西,但沒有保證。無論你真的不應該擔心這個優化級別,除非你做了很多循環。

2

上面的例子是不一樣的。如果你這樣做,那麼arr.length將在每個循環迭代中被檢查並且本質上將表現得更差。這樣做的原因是假設您有以下循環:

for (var i = 0; i < arr.length; i++) { 
    arr.splice(i,1); 
} 

在這種情況下arr.length不能被緩存,因爲它的尺寸將減小每次循環。然而,對於大多數情況下,你的數組在整個循環中保持相同的長度,所以你應該像在後一個例子中一樣緩存長度,以防止額外的鏈查找。

0

不是。它是一個解釋器,不是編譯器。

JavaScript是動態的,你無法使用靜態語言進行儘可能多的優化。

您在JavaScript中擁有類型自由並擁有eval意味着大多數優化與普通(C++)編譯器在類似的過程代碼上所做的優化是不安全的。

此外,解釋器的目標是儘可能快地解釋代碼並儘可能快地運行它。

編譯器的目標是讓代碼儘可能快。

單獨註釋中,Chrome,FF4(5)和IE9(10)速度較快。你不需要像這樣做微觀優化。雖然如果你確實有瓶頸,你仍然需要手工優化簡單的東西(包括循環展開)

相關問題