JavaScript字符串连接速度

Foo*_*mus 5 javascript string

有人可以向我解释这个:

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("")是一种优化技巧.我的测试有什么缺陷吗?

Mik*_*uel 9

使用join("")是在IE6上组合大字符串以避免O(n**2)缓冲区副本的优化技巧.从来没有预料到组成小字符串的巨大性能胜利,因为O(n**2)唯一真正支配数组的大量开销.

现代翻译通过使用"依赖字符串"来解决这个问题.有关依赖字符串的解释以及一些优点和缺点,请参阅此mozilla错误.

基本上,现代口译员知道许多不同类型的字符串:

  1. 一组字符
  2. 另一个字符串的切片(子字符串)
  3. 两个其他字符串的串联

这使得连接和子串O(1)的代价是有时保留过多的子包缓冲区,从而导致垃圾收集器的低效率或复杂性.

一些现代解释器已经开始考虑进一步将(1)分解为仅用于ASCII字符串的byte [] s,以及当字符串包含不能容纳在一个字节中的UTF-16代码单元时的uint16s数组.但我不知道这个想法是否真的存在于任何翻译中.