谁能给我解释一下:
http://jsperf.com/string-concatenation-1/2
如果你很懒,我测试了 A) 和 B):
一个)
var innerHTML = "";
items.forEach(function(item) {
innerHTML += item;
});
B)
var innerHTML = items.join("");
两个测试的 items
都是相同的 500 元素字符串数组,每个字符串都是随机的,长度在 100 到 400 个字符之间。
A) 最终速度提高了 10 倍。这怎么可能——我一直认为使用 join("")
连接是一种优化技巧。我的测试有什么缺陷吗?
最佳答案
使用 join("")
是在 IE6 上组成大字符串以避免 O(n**2)
缓冲区副本的优化技巧。由于 O(n**2)
只真正控制了较大 n 的数组的开销,因此从未期望它会在组成小字符串方面取得巨大的性能胜利。
现代解释器通过使用“依赖字符串”来解决这个问题。看这个mozilla bug用于解释依赖字符串和一些优点和缺点。
基本上,现代解释器知道许多不同种类的字符串:
- 字符数组
- 另一个字符串的切片(子字符串)
- 其他两个字符串的串联
这使得串联和子字符串的复杂度为 O(1),代价是有时会保持过多的子字符串缓冲区处于事件状态,从而导致垃圾收集器效率低下或复杂。
一些现代解释器已经尝试将 (1) 进一步分解为 byte[]s for ASCII only strings 和 uint16s arrays when a string contains a UTF-16 code unit that can't fit into a byte .但我不知道这个想法是否真的存在于任何解释器中。
关于JavaScript 字符串连接速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6551918/