簡體   English   中英

JavaScript 字符串連接速度

[英]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 錯誤以了解相關字符串的說明以及一些優點和缺點。

基本上,現代解釋器知道許多不同類型的字符串:

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

這使得連接和 substring O(1) 有時會導致過多的子字符串緩沖區處於活動狀態,從而導致垃圾收集器效率低下或復雜性。

一些現代解釋器已經嘗試了將 (1) 進一步分解為僅 ASCII 字符串的 byte[]s 和 uint16s 的 arrays 的想法,當字符串包含無法放入一個字節的 UTF-16 代碼單元時。 但我不知道這個想法是否真的存在於任何解釋器中。

Lua 編程語言的作者在這里解釋了@Mike Samuel 所說的緩沖區開銷 示例在 Lua 中,但問題在 JavaScript 中是相同的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM