JavaScript 字符串连接速度

标签 javascript string

谁能给我解释一下:

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用于解释依赖字符串和一些优点和缺点。

基本上,现代解释器知道许多不同种类的字符串:

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

这使得串联和子字符串的复杂度为 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/

相关文章:

javascript - getLocationAbsUrl 与 getCurrentUrl

javascript - Symfony2 : How to check and display javascript enabled/disabled on the website

javascript - 用 Typescript 编写的 React 应用程序中的错误参数类型

javascript - 如何在 Angular 2中的模板 View 内进行嵌套循环

c# - 按条件并保持顺序将两个字符串合并为一个字符串

javascript - 如何在不破坏 HTML 标签的情况下将空格转换为 &nbsp?

c++ - 声明一个 String 类型的数组,其中包含带有填充的数字

java - 如何使 Java GUI settext 识别二维数组输入的换行符

php - 使用php获取字符串中第一个大写字母的位置

java - 单点登录 Gmail