[英]JavaScript string concatenation speed
有人可以向我解釋一下嗎:
http://jsperf.com/string-concatenation-1/2
如果你很懶,我測試了 A) vs B):
一個)
var innerHTML = "";
items.forEach(function(item) {
innerHTML += item;
});
二)
var innerHTML = items.join("");
其中兩個測試的items
是相同的 500 元素字符串數組,每個字符串是隨機的,長度在 100 到 400 個字符之間。
A) 最終速度提高了 10 倍。 這怎么可能——我一直認為使用join("")
進行連接是一種優化技巧。 我的測試有問題嗎?
使用join("")
是在 IE6 上組合大字符串以避免O(n**2)
緩沖區副本的優化技巧。 由於O(n**2)
僅在較大 n 的數組的開銷中占主導地位,因此從未期望它會在組合小字符串時獲得巨大的性能提升。
現代解釋器通過使用“依賴字符串”來解決這個問題。 請參閱此mozilla 錯誤以了解相關字符串的說明以及一些優點和缺點。
基本上,現代解釋器知道許多不同類型的字符串:
這使得連接和 substring O(1) 有時會導致過多的子字符串緩沖區處於活動狀態,從而導致垃圾收集器效率低下或復雜性。
一些現代解釋器已經嘗試了將 (1) 進一步分解為僅 ASCII 字符串的 byte[]s 和 uint16s 的 arrays 的想法,當字符串包含無法放入一個字節的 UTF-16 代碼單元時。 但我不知道這個想法是否真的存在於任何解釋器中。
Lua 編程語言的作者在這里解釋了@Mike Samuel 所說的緩沖區開銷。 示例在 Lua 中,但問題在 JavaScript 中是相同的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.