有人可以向我解释一下这个吗:
http://jsperf.com/string-concatenation-1/2 http://jsperf.com/string-concatenation-1/2
如果你很懒,我测试了 A) 和 B):
A)
var innerHTML = "";
items.forEach(function(item) {
innerHTML += item;
});
B)
var innerHTML = items.join("");
Where items
这两个测试都是相同的 500 个元素的字符串数组,每个字符串都是随机的,长度在 100 到 400 个字符之间。
A) 最终速度提高了 10 倍。这怎么可能——我一直认为使用连接join("")
是一个优化技巧。我的测试有什么问题吗?
Using join("")
是在 IE6 上组合大字符串的优化技巧,以避免O(n**2)
缓冲区副本。自从编写小弦乐以来,从来没有想到会取得巨大的性能胜利。O(n**2)
仅当 n 较大时才真正主导数组的开销。
现代解释器通过使用“依赖字符串”来解决这个问题。看到这个莫兹拉错误 https://bugzilla.mozilla.org/show_bug.cgi?id=616910有关依赖字符串的说明以及一些优点和缺点。
基本上,现代解释器知道许多不同类型的字符串:
- 字符数组
- 另一个字符串的切片(子字符串)
- 其他两个字符串的串联
这使得连接和子字符串的复杂度为 O(1),但有时会导致过多的子字符串缓冲区处于活动状态,从而导致垃圾收集器效率低下或复杂。
一些现代解释器已经尝试过将 (1) 进一步分解为仅 ASCII 字符串的 byte[] 和当字符串包含无法容纳一个字节的 UTF-16 代码单元时的 uint16 数组。但我不知道这个想法是否真的存在于任何解释者中。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)