2011-07-01 46 views
5

有人能解释这一个对我说:的JavaScript字符串连接速度

http://jsperf.com/string-concatenation-1/2

如果你懒,我测试A)对B):

A)

var innerHTML = ""; 

items.forEach(function(item) { 
    innerHTML += item; 
}); 

B)

var innerHTML = items.join(""); 

这两个测试的items是相同的500个元素的字符串数组,每个字符串是随机的,长度在100到400个字符之间。 A)最终快10倍。这怎么可能 - 我一直认为使用join("")连接是一个优化技巧。我的测试有什么缺陷吗?

+0

除非你加入了很大数量的字符串(非常大的是依赖于浏览器),'Array.Join'会比'+'慢, – Mrchief

回答

8

使用join("")是在IE6上组合大字符串以避免O(n**2)缓冲区副本的优化技巧。由于O(n**2)只是真正控制了数组的大量开销,因此从来没有想到在构造小字符串方面取得了巨大的成绩。

现代口译人员通过使用“依赖字符串”来解决这个问题。请参阅此mozilla bug以获取相关字符串的解释以及一些优点和缺点。

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

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

这使得连接和子串O(1)的代价是有时会保留很多子串缓冲区,导致Garbag中的效率低下或复杂e收藏家。

一些现代口译人员已经发挥了将ASCII码字符串进一步分解为字节[]的想法,以及字符串包含UTF-16编码单元的uint16s数组不能适合一个字符串的想法字节。但我不知道这个想法是否真的在任何口译员身上。