JavaScript 字符串连接速度

2024-03-29

有人可以向我解释一下这个吗:

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有关依赖字符串的说明以及一些优点和缺点。

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

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

这使得连接和子字符串的复杂度为 O(1),但有时会导致过多的子字符串缓冲区处于活动状态,从而导致垃圾收集器效率低下或复杂。

一些现代解释器已经尝试过将 (1) 进一步分解为仅 ASCII 字符串的 byte[] 和当字符串包含无法容纳一个字节的 UTF-16 代码单元时的 uint16 数组。但我不知道这个想法是否真的存在于任何解释者中。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JavaScript 字符串连接速度 的相关文章

  • 通过删除连续的重复项来减少字符串长度

    我有一个包含 2 个字段的 R 数据框 ID WORD 1 AAAAABBBBB 2 ABCAAABBBDDD 3 我想通过仅保留字母而不是重复中的重复项来简化具有重复字母的单词 e g AAAAABBBBB应该给我AB and ABCAA
  • 在 JavaScript 中计算不包括周末和节假日的天数

    我正在尝试编写一个代码 其中将计算总天数 不包括周末和自定义假期 我通过 stackoverflow 和 adobe 论坛进行搜索以找到解决方案 并提供了以下代码 如果公共假期恰逢工作日 周六至周三 则不计算在内 我的问题是 如果公共假期落
  • 添加选中的单选按钮的总数

    UPDATE 如果您尝试此链接上的表格http jsfiddle net Matt KP BwmzQ http jsfiddle net Matt KP BwmzQ 按下小提琴并选择右上角的 40 英镑单选按钮 然后在底部看到订单总额 上面
  • 应该使用encodeURI吗?

    javascript 的encodeURI 函数有任何有效用途吗 据我所知 当您尝试发出 HTTP 请求时 您应该 完整的 URI 您想要放入 URI 中的某些片段 可以是 unicode 字符串或 UTF 8 字节序列 在第一种情况下 显
  • 在 d3 中应用转换时出现错误

    我正在尝试对我在 d3 中设计的条形图应用一些过渡效果 这是我的代码 svg selectAll bar data data enter append g attr class bar append rect attr rx barRadi
  • Sequelize 关联 - 请改用 Promise 风格

    我正在尝试将 3 张桌子连接在一起Products Suppliers and Categories然后排SupplierID 13 我读过了如何在sequelize中实现多对多关联 https stackoverflow com a 25
  • 如何从左向右滑动文本和图像并具有滑动效果[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 删除字符串 C 的第一个字符

    我试图删除字符串的第一个字符并保留其余部分 我当前的代码无法编译 我对如何修复它感到困惑 My code char newStr char charBuffer int len strlen charBuffer int i 1 char
  • AngularJS 服务并承诺最佳实践

    我有一个 AngularJS 应用程序services 调用 http资源并返回promise我在控制器中解决了这个问题 这是我正在做的事情的示例 app service Blog function http q var deferred
  • 如何将数据从 JavaScript 发送到 Python

    我正在 jinja2 和 python2 7 上使用 GAE 进行 Web 开发 我可以从Python获取数据 但我无法将数据从 JavaScript 发送到 Python 这是 JavaScript 代码 function toSave
  • es6-module 默认导出导入为未定义

    我不确定我在这里缺少什么 我正在使用 jspm 和 es6 module loader 开发一个项目 我有一个模块定义如下 import hooks from hooks import api from api import tools f
  • 当系列没有相同的时间值时,如何在工具提示中显示所有系列

    我有一个显示多个时间序列的图表 不同时间序列不会同时采样 有没有办法在工具提示中显示所有系列 在示例中 您可以看到所有系列都包含在前 2 个点的工具提示中 因为它们是同时采样的 其余点仅包含 1 个系列 var myChart echart
  • 液体字符串中的转义字符

    我正在尝试将包含各种尺寸的标签列表放在一起 在 Shopify 中使用 Liquid 尺寸使用单引号和双引号表示英寸和英尺 因为它同时使用两者 所以会导致字符串正确关闭的问题 我尝试过使用标准转义字符 但这似乎不起作用 是否可以在 Liqu
  • 替换 JSON 中的转义字符

    我想用空格替换 JSON 字符串中的 字符 我怎样才能做到这一点 我发现从 JSON 字符串中删除所有转义字符的最简单 最好的方法是将字符串传递到正则表达式 Unescape 方法 此方法返回一个没有转义字符的新字符串 甚至删除了 n t
  • Python 中的 Firebase 身份验证时出现 KeyError:“databaseURL”

    相信你做得很好 我是 firebase 的新手 正在尝试进行用户身份验证 我已经安装了pyrebase4并在firebase控制台上创建了一个项目 我还启用了使用 电子邮件和密码 登录并尝试连接我的应用程序 下面是我正在尝试的代码 impo
  • 分配函数后如何删除 onmouseout 事件?

    我有一个问题 我正在为 onmouseout 事件分配一个函数 但运行该事件后 我需要将其删除 将非常感谢您的帮助 这取决于你的代码 如果你用 d3 这样做 那么你可以说 在 onmouseout 事件函数中 element on mous
  • C 中什么函数可以替换字符串中的子字符串?

    给定一个 char 字符串 我想查找所有出现的子字符串并将其替换为备用字符串 我没有看到任何简单的函数可以实现这一点
  • 阻止 PM2 上不同时运行的请求

    在我的 Express 应用程序中 我在应用程序中定义了 2 个端点 一种用于 is sever up 检查 另一种用于模拟阻塞操作 app use status req res gt res sendStatus 200 app use
  • 如何加载Jquery Tiny滚动条

    所以我想自定义一个滚动条 我发现了一个很小的滚动条 这是一个jquery插件 http baijs nl tinyscrollbar http baijs nl tinyscrollbar 问题是 无论如何我都无法让它工作 我将 Jquer
  • gjs 如何使用 g_data_input_stream_read_line_async 在 Gnome Shell 扩展中读取套接字流

    我正在尝试编写一个 Gnome Shell 扩展 通过 Socket 服务器与 Arduino 进行通信 服务器和 Arduino 运行良好 但我陷入了监听传入服务器消息的扩展代码 因为我需要一种非阻塞方法 所以使用异步读取行 https

随机推荐

  • 使用Systemjs时检测页面上是否加载了Angular

    UPDATE 这个问题专门讲了角2 现在是过时的 在发布时 没有办法检测它是否已加载到页面上 我还没有测试过其他版本 但是 Angular 8 现在有一种简单的方法来检测这一点 并且已经在下面的答案中指出了 我正在尝试找出一种好的 最好是最
  • 用于获取访问次数最少的目录日期/时间的 shell 命令

    find 命令中是否有可用的排序选项来获取访问日期 时间最少的目录 find type d printf A p n sort n tail n 1 cut d f 2 如果您喜欢不带前导路径的文件名 请替换 p by f
  • 如何在Picasso中清除缓存并重新加载图像?

    我在用Picasso在我的应用程序中加载图像 但我面临一个问题 我的图像URL是相同的 但图像正在改变backend调用相同的 URL 但是Picasso加载保存在缓存中的相同图像 现在我想清除该图像的缓存并再次重新加载图像 我尝试过的我搜
  • 在 Windows 10 上使用 mingw 进行 CMake:检测 CXX 编译器 ABI 信息 - 失败

    我想使用 cmake 在 Windows 10 上创建 MinGW Makefile 我已经安装了 mingw 并且可以毫无问题地使用 mingw32 make 和 g 命令 测试项目是一个超级简单的CMakeLists txt文件 cma
  • 版本控制压缩文件(docx、odt)

    有些格式实际上是伪装的 zip 文件 例如docx 或 odt 如果我将它们直接存储在版本控制中 它们将被作为二进制文件处理 我理想的解决方案是 有一个钩子可以创建一个foo docx 每个目录foo docx提交之前的文件 将所有文件解压
  • C中的多态性

    我正在用 C 语言设计一个程序来操作几何图形 如果每种类型的图形都可以由相同的基元操作 那将非常方便 我怎样才能在C中做到这一点 通常使用函数指针来完成此操作 换句话说 保存数据的简单结构and指向操作该数据的函数的指针 在 Bjarne
  • 恢复 Typescript 定义 Nuget 包

    我目前正在开发一个新项目 该项目将 Typescript 用于所有客户端代码 我使用许多纯 JavaScript 库来让它们与我的 Typescript 一起使用 我使用 Nuget 通过以下包管理器命令提取 d ts 文件 包管理器命令示
  • UserManager SendEmailAsync 未发送电子邮件

    我正在使用以下代码尝试异步发送电子邮件 但没有发送电子邮件 并且我不确定哪里做错了 我还在 web config 中添加了电子邮件协议的第二段代码 发送电子邮件异步代码 await UserManager SendEmailAsync us
  • Android 上的 AWS CloudWatch Log

    我正在尝试在 Android 应用程序中使用 AWS CloudWatch Log 我对 aws client 有以下配置 val basicAWSCredentials BasicAWSCredentials Xxxxxx Yyyyyy
  • 字符串交错的动态规划问题解决方案

    我试图解决这个问题 但我放弃了 找到了下面的解决方案 尽管我不明白该解决方案是如何工作的 或者为什么它有效 任何深入的解决方案将不胜感激 问题 Given s1 s2 s3 求是否s3由交错形成s1 and s2 例如 给定 s1 aabc
  • 如何从 python 中的命名元组中获取名称?

    我创建一个像这样的命名元组 from collections import namedtuple spam namedtuple eggs x y z ham spam 1 2 3 然后我可以使用例如访问火腿的元素 gt gt gt ham
  • 禁用部分内容的 CSS

    我正在使用 Yii bootstrap 扩展 但遇到一些样式问题 因为 bootstrap css 文件影响页面的主要内容 我的主要内容是使用 OpenLayers 完成的地图 因此我在它们之间混合样式时遇到了一些问题 我尝试做一个更通用的
  • 没有 v-model 的 Vue.JS 复选框

    尝试在不使用 v model 的情况下创建复选框
  • 服务层/存储库模式

    我正在使用 EF4 的服务层 存储库 工作单元模式构建一个 MVC 应用程序 我对逻辑有点困惑 我知道重点是解耦系统 但我有点困惑 因此 MVC 控制器调用服务来填充视图模型 那么可以肯定地说 MVC 应用程序耦合到服务层吗 然后服务层调用
  • sqlite3 - 插入 - javascript 对象作为值

    使用 javascript 对象作为 sqlite3 插入的值的最简单的解决方案是什么 下面的代码不起作用 const values name John age 34 language english db run INSERT INTO
  • 为什么 lodash 在否定函数中使用 switch-case? [复制]

    这个问题在这里已经有答案了 下面的代码是源码negateLodash 中的函数 我们可以看到 当参数长度小于4时 它使用switch case而不是使用apply直接地 这段代码有什么魔力呢 它会使性能更好吗 为什么分割点是4 functi
  • 如何更改 django runserver url?

    我正在尝试更改 django 项目 url 以便想要连接到局域网中网站的用户将看到 url 而不是 localhost 8000 或 127 0 0 1 我需要将 localhost 8000 users board 更改为http exa
  • Rails Engine + Mongoid:找不到名为“default”的会话的配置

    我创建了一个 Rails Mountable 应用程序并添加了 mongoid 和 rspec gem 如果我现在尝试运行我的规范 我会收到以下错误 Mongoid Errors NoSessionConfig Problem No con
  • HTML5 本地存储和变量类型

    我正在对 HTML5 中的本地存储进行一些测试 注意我使用的是 Safari 6 0 2 因为似乎许多 Web 引擎处理它们的方法不同 如果我这样做 localStorage setItem subTotal Number 12345 I
  • JavaScript 字符串连接速度

    有人可以向我解释一下这个吗 http jsperf com string concatenation 1 2 http jsperf com string concatenation 1 2 如果你很懒 我测试了 A 和 B A var i