2011-07-01 48 views
5

有人能解釋這一個對我說:的JavaScript字符串連接速度

http://jsperf.com/string-concatenation-1/2

如果你懶,我測試A)對B):

A)

var innerHTML = ""; 

items.forEach(function(item) { 
    innerHTML += item; 
}); 

B)

var innerHTML = items.join(""); 

這兩個測試的items是相同的500個元素的字符串數組,每個字符串是隨機的,長度在100到400個字符之間。 A)最終快10倍。這怎麼可能 - 我一直認爲使用join("")連接是一個優化技巧。我的測試有什麼缺陷嗎?

+0

除非你加入了很大數量的字符串(非常大的是依賴於瀏覽器),'Array.Join'會比'+'慢, – Mrchief

回答

8

使用join("")是在IE6上組合大字符串以避免O(n**2)緩衝區副本的優化技巧。由於O(n**2)只是真正控制了數組的大量開銷,因此從來沒有想到在構造小字符串方面取得了巨大的成績。

現代口譯人員通過使用「依賴字符串」來解決這個問題。請參閱此mozilla bug以獲取相關字符串的解釋以及一些優點和缺點。

基本上,現代口譯知道許多不同類型的串的:

  1. 另一個字符串的字符數組
  2. 切片(子串)
  3. 其他兩個字符串
  4. 的串聯

這使得連接和子串O(1)的代價是有時會保留很多子串緩衝區,導致Garbag中的效率低下或複雜e收藏家。

一些現代口譯人員已經發揮了將ASCII碼字符串進一步分解爲字節[]的想法,以及字符串包含UTF-16編碼單元的uint16s數組不能適合一個字符串的想法字節。但我不知道這個想法是否真的在任何口譯員身上。