`

如何在 JAVASCRIPT 中高效地连接字符串

 
阅读更多
原文出处,感谢原作者:
http://hyjk2000.sinaapp.com/2011/06/15/optimizing-javascript-string-concat-speed/

字符串连接一直是 JavaScript 中最慢的操作之一。在 JavaScript 中连接字符串有两种常用做法:一是通过加法运算符(+);二是将字符串碎片放入 Array,再调用 Array 对象的 join() 方法。
关于这两种方法孰优孰劣,一直有很多争论。早期的浏览器没有对用加法运算符进行字符串连接进行优化。由于字符串是不可变的,进行连接操作时必然要创建中间字符串来储存连接结果,而在后台大量进行这种操作会使字符串连接的性能极其低下。于是,大部分人认为利用 Array 对象的性能更好。
真相的确如此吗?

于是我决定做一个简单粗略的测试。让浏览器连接一百万个字符串,并记录下它们要花掉多少时间。为了获得更全面的结果,测试分成短字符串连接和长字符串连接两种,并且每种测量三次取平均值进行记录。
获取测试程序:Demo
Update (08/06/2013): jsPerf.com 上的测试实例:Test Case
由于 IE6 的性能实在太差,用加法运算符连接十万个字符串就会假死,于是只进行了连接 50000 个字符串的操作。另外,因为测试条件所限,IE6 是在 Windows XP Mode 中执行的,IE8 是在另一台电脑上执行的。
首先是一百万个短字符串(’dummy’)连接测试结果:



从结果上可以明显看出,在 Chrome 12、Firefox 4、IE 8 上,用加法运算符的性能要高得多。尤其是 Firefox 4,两种方法的速度差别相当惊人。这是因为这些浏览器已经优化了字符串连接,在所有情况下用数组技术都要比用加法运算符慢。
IE 6 不出意外地出现了相反的情况,使用数组技术有非常大的性能优势。IE 7 的情况与 IE 6 基本相同。
IE 9 的结果比较奇怪,我推测可能是因为 IE 9 的数组处理性能有了很大改进,所以在后面我加大了字符串长度后,在 IE 9 上使用数组技术就比用加法运算符慢了。
然后是一百万个长字符串(’thequickbrownfoxjumpsoverthelazydog195476825412355849751364859′)的连接测试结果:



随着字符串的长度增长,在 Chrome 12、Firefox 4、IE 8、IE 9 上,使用加法运算符所消耗的时间并没有显著增长,但是使用数组技术所消耗的时间有一定增长。
IE 6 仍然呈现了数组技术的优势,用加法运算符甚至出现了假死,这是因为处理中间结果所消耗的资源随着字符串长度的增长而呈指数增长。
现在我们就得到了问题的答案:利用数组技术来连接字符串性能更高的说法已经不再适用于现代浏览器。不过,仍然有很多用户还在坚持使用老版本的浏览器(参见此处)。所以还是应该结合用户群的特点来选择适当的算法。不过在大部分情况下,用加法运算符是更佳的选择。
  • 大小: 18 KB
  • 大小: 20.6 KB
分享到:
评论

相关推荐

    头歌教学实践平台 Web前端开发基础 JavaScript学习手册九:字符串

    2. 连接字符串:可以使用`+`运算符或`concat()`方法连接字符串。 3. 字符串切割:`slice()`, `substring()`, `substr()`用于截取字符串,`split()`根据分隔符切割成数组。 4. 查找替换:`indexOf()`查找指定子串首次...

    JavaScript中的字符串操作 .txt

    8. **模板字符串**:ES6引入了模板字符串,允许在字符串中嵌入变量。例如: ```javascript var name = "Alice"; var message = `Hello, ${name}!`; console.log(message); // 输出 "Hello, Alice!" ``` 9. **...

    javascript字符串操作

    - 在字符串中,某些特殊字符需要使用转义字符来表示,如`\n`(换行)、`\t`(制表符)等。 - 示例:`var example = "This is a \ntest string.";` #### 字符串属性与方法 1. **`length`属性**: - `length`属性返回...

    关于js中连接字符串效率的测试例子!

    在JavaScript中,字符串连接是常见的操作,特别是在处理大量文本或者拼接HTML时。然而,不同的字符串连接方法在性能上可能有显著的差异。本篇内容将深入探讨JavaScript中字符串连接的几种常见方式,并通过测试例子...

    连接 字符 串.rar

    - 格式化字符串允许在字符串中插入变量值,例如C++的`printf`、Python的`format()`函数和Java的`MessageFormat`类。 - 现代语言如Python和JavaScript的模板字符串提供了更直观和灵活的格式化方式。 5. **Unicode...

    以太坊solidity字符串拼接实现

    不过,在Solidity编程语言中,由于其特定的类型系统和内存管理机制,没有像其他高级编程语言(如JavaScript或Python)中那样直接支持字符串拼接运算符。因此,开发者需要了解如何在Solidity中实现字符串拼接,这通常...

    JavaScript语言教程:JavaScript 字符串

    字符串可以通过多种方式进行操作,例如查找字符、连接字符串等。本篇教程将详细介绍JavaScript中的字符串方法及其应用场景。 #### 二、字符串方法解析 ##### 1. `charAt()` **功能**: 返回字符串中指定索引位置的...

    js版字符串快速检索

    "js版字符串快速检索"这个主题聚焦于如何高效地在JavaScript环境中查找字符串中的特定子串。以下是一些相关的知识点,涵盖了基础概念、常见方法以及优化策略。 1. **字符串基本操作**:在JavaScript中,字符串是不...

    JavaScript程序设计课件:字符串型.pptx

    字符串引号的嵌套是JavaScript的一个特性,允许你在字符串中混合使用单引号和双引号。这意味着你可以用单引号包围双引号内的文本,反之亦然,这样就不需要在字符串内部使用转义字符。例如: ```javascript var ...

    JavaScript程序设计ES中字符串操作方法共1页.p

    10. **正则表达式**:在字符串中,可以使用`match()`、`split()`、`test()` 和 `replace()` 与正则表达式结合,进行复杂的文本匹配和操作。 11. **padStart() 和 padEnd()**:这两个方法用于在字符串的开头或结尾...

    JavaScript字符串函数大全

    - **功能**:从字符串中截取子字符串。 - **参数**: - `x`:原字符串。 - `n`:起始位置。 - `m`:截取长度。 - **示例**: ```javascript let str = "Hello, world!"; console.log(Mid(str, 7, 5)); // 输出...

    计算机软件-商业源码-14 连接字符串.zip

    "连接字符串"是编程中常见的任务,特别是在处理文本数据时。这里我们将深入探讨“连接字符串”这一主题,以及它在计算机软件开发中的应用。 字符串连接,也称为字符串拼接,是将两个或更多个字符串合并成一个新字符...

    JavaScript实现将数组中所有元素连接成一个字符串的方法

    在JavaScript中,数组元素的连接通常涉及到将数组中的多个值合并为一个单一的字符串,这在处理数据展示、拼接字符串或格式化输出时非常有用。本文将详细讲解如何使用JavaScript的`join()`方法来实现这个功能。 `...

    JavaScript程序设计-ES中字符串操作方法.pdf

    这个方法用于获取字符串中指定索引位置的字符。`index`参数是你想要提取的字符的位置,索引从0开始。例如,`"Hello".charAt(1)`将返回字符'e'。 2. `charCodeAt(index)`: 此方法返回字符串中指定位置字符的...

    连接字符串

    在不同的编程语言中,连接字符串的方法会有所不同,但核心思想是相同的:将字符串的字符序列合并。 二、常见编程语言中的字符串连接 1. **Python**: 在Python中,可以使用`+`运算符直接连接字符串,或者使用`...

    js操作字符串

    1. 访问字符串:字符串中的每个字符都可以通过索引来访问,索引从0开始。 ```javascript var str = 'JavaScript'; console.log(str[0]); // 输出 'J' ``` 2. 获取字符串长度:使用 `length` 属性获取字符串的长度。 ...

Global site tag (gtag.js) - Google Analytics