2011-05-24 86 views

回答

9

在這實際上事(閱讀:IE)瀏覽器將每一次計算,所以它的速度更快存儲局部變量中的值。

http://jsperf.com/string-length


used to be

var len = someArray.length; 
for (var i=0; i<len; i++) { 
    // ... 
} 

快於

for (var i=0; i<someArray.length; i++) { 
    // ... 
} 

但這些天,V8的(Chrome的JS引擎)優化後跑得比較快前任的。這真是太棒了 - 請記住,你並不需要擔心Chrome中的性能。


如果你很好奇,以瞭解更多關於JavaScript性能,High Performance JavaScript是一個堅實的讀取。儘管如此,儘管在IE中使代碼運行速度更快(6,7,8或甚至9),但它仍然可以讓代碼在Chrome或Firefox 4中運行得更慢。

+0

有趣的是,在IE9中它仍然比較慢。儘管鉻是針鋒相對的。 – Matt 2011-05-24 14:58:59

1

第二是到目前爲止更安全的方式。在第一個你假設它不會被重新計算。在第二個你知道它不會。第二個並不總是最好的方式。只有當你知道其他進程不會影響數組的長度時它纔會起作用。所以對於全局變量等,你必須小心。這也適用於修改在數組上限處停止的for循環內數組的內容(長度)。

0

理論上,我希望第二個代碼塊應該更快。

但是,考慮到今天的JS解釋器實際上是高度優化的JIT編譯器,我想他們會發現這種事情並優化它。

這應該適用於目前主流使用的幾乎所有的瀏覽器,除了IE8和更低版本之外,任何人都會猜測它是如何實現的,但這種方式會很慢。

1

Strings are immutable in JavaScript,所以即使不好的Javascript實現也不太可能在每次訪問時重新計算字符串的length屬性。

你實際上可以使用jsperf自己測試它;使用Chrome 12,it actually looks like your first example is faster

+1

這不是長度的問題 - 因爲字符串是不可變的,它們的長度是一個(常量)屬性。這是一個重複訪問該屬性的問題。 – 2011-05-24 15:00:33

+0

@Matt - 事實上,我在考慮可以隱藏複雜計算的C#屬性。我的觀點基本上是因爲字符串是不可變的,長度是一個常數值,所以在OP的例子中不太可能會有顯着的性能差異。 (正如你發現的那樣,片段在不同的JS實現中實際上表現不同) – Dexter 2011-05-24 15:34:32