有人可以向我解释这个:
http://jsperf.com/string-concatenation-1/2
如果你很懒,我测试了A)vs B):
一个)
var innerHTML = "";
items.forEach(function(item) {
innerHTML += item;
});
Run Code Online (Sandbox Code Playgroud)
B)
var innerHTML = items.join("");
Run Code Online (Sandbox Code Playgroud)
其中items
对两个测试是串的相同的500元件阵列,每个串被随机和字符长度100和400之间.
A)最终快10倍.这怎么可能 - 我一直认为连接使用join("")
是一种优化技巧.我的测试有什么缺陷吗?
使用join("")
是在IE6上组合大字符串以避免O(n**2)
缓冲区副本的优化技巧.从来没有预料到组成小字符串的巨大性能胜利,因为O(n**2)
唯一真正支配数组的大量开销.
现代翻译通过使用"依赖字符串"来解决这个问题.有关依赖字符串的解释以及一些优点和缺点,请参阅此mozilla错误.
基本上,现代口译员知道许多不同类型的字符串:
这使得连接和子串O(1)的代价是有时保留过多的子包缓冲区,从而导致垃圾收集器的低效率或复杂性.
一些现代解释器已经开始考虑进一步将(1)分解为仅用于ASCII字符串的byte [] s,以及当字符串包含不能容纳在一个字节中的UTF-16代码单元时的uint16s数组.但我不知道这个想法是否真的存在于任何翻译中.