JavaScript 字符串拼接性能分析小记

简介: JavaScript 中,我们经常会因为各种各样的原因去拼接字符串,可能是为了Html的呈现,可能是为了属性的设置,也可能仅仅是为了输出调试日志。   每次拼接字符串的时候,我们很自然地去考虑它的性能,是不是str=str+a是不是和str+=a性能一样,使用数组Join是不是会更快一些,哪一种才是最好的实现。

JavaScript 中,我们经常会因为各种各样的原因去拼接字符串,可能是为了Html的呈现,可能是为了属性的设置,也可能仅仅是为了输出调试日志。

  每次拼接字符串的时候,我们很自然地去考虑它的性能,是不是str=str+a是不是和str+=a性能一样,使用数组Join是不是会更快一些,哪一种才是最好的实现。

的确,我们有诸多方式去拼接字符串,下面本文将会将主流字符串拼接方逐一进行性能评测。

公平起见,我们的测试都是跑在各浏览器的最后一个正式发布版本上,即IE9 ,Chrome19,FF13 及Opera12。

为了测试,我们先构造一个 data,它有个成员,是个100大小的数组。

   1: var length = 100; 
   2: var data = { list: [] }; 
   3: for (var i = 0; i < length; i ++) { 
   4:     data.list.push({ 
   5:         str1: 'chsword, 邹健, Zou Jian ', 
   6:         str2: 'http://chsword.cnblogs.com', 
   7:         str3: 'http://www.chsword.net', 
   8:         str4: '"http://weibo.com/chsword","http://t.qq.com/chsword"', 
   9:         str5: 'test' 
  10:     }); 
  11: }; 

准备好了,那么我们来进行测试,我选定了8种字符串拼接的方法,然后每一种运行1W次的字符串拼接,每一次拼接将元素的五个子元素拼接在一起:

1.str+=str+a;
2.str=str.concat(a);
3.arr.push(a); and arr.join(“”);
4.str=str.concat(a,b,c,d,e);
5.str=str+a;
6.str=String.prototype.concat(str,a,b,c,d,e);
7.str=String.prototype.concat.apply(s, [a,b,c,d,e]);
8.str=String.prototype.concat(str,a);
9.arr[arr.length]=a

我将以上测试运行在这些浏览器上: IE 9, Chrome 19, Firefox 13, Opera 12.

结果为:

注:图表中单位为MS,标记为2000的都是运行了1分钟以上还未停止的。

通过图表,我们可以看到+=的性能在主流浏览器中平均最高,不过,要说明一点,+=操作在IE早期版本中,性能较差。

Array.Join 来拼接字符串,在FF和Chrome中都比+=方法慢上数倍。

另外,还有像String.prototype.concat(str,a,b,c,d,e)这样的操作,如果在Chrome及Opera中大量执行的话,会直接令页面挂掉,所以这些都是不推荐使用的

总结一下,总体看来+=的性能最高,早先的浏览器中,使用Array.Join性能会较高

测试代码 :

1.使用 += 

   1: var str=""; 
   2: for (var i = 0; i < number; i ++) { 
   3:     for(var j=0;j<length;j++){ 
   4:         str+=data.list[j].str1; 
   5:         str+=data.list[j].str2;
   6:         str+=data.list[j].str3;
   7:         str+=data.list[j].str4;
   8:         str+=data.list[j].str5;
   9:     } 
  10:     str+="\n"; 
  11: } 

2.str.concat

   1: var str = ""; 
   2: for (var i = 0; i < number; i++) { 
   3:     for (var j = 0; j < length; j++) { 
   4:         str=str.concat(data.list[j].str1); 
   5:         str=str.concat(data.list[j].str2); 
   6:         str=str.concat(data.list[j].str3); 
   7:         str=str.concat(data.list[j].str4); 
   8:         str=str.concat(data.list[j].str5); 
   9:     } 
  10:     str=str.concat( "\n"); 
  11: } 

3.Use Array Join  

   1: var arr=[]; 
   2: for (var i = 0; i < number; i ++) { 
   3:     for(var j=0;j<length;j++){ 
   4:         arr.push(data.list[j].str1); 
   5:         arr.push(data.list[j].str2); 
   6:         arr.push(data.list[j].str3); 
   7:         arr.push(data.list[j].str4); 
   8:         arr.push(data.list[j].str5); 
   9:     } 
  10:     arr.push("\n"); 
  11: } 
  12: arr.join(""); 

4.str=str.concat(a,b,c,d,e);  

   1: var str = ""; 
   2: for (var i = 0; i < number; i++) { 
   3:     for (var j = 0; j < length; j++) { 
   4:         str = str.concat(data.list[j].str1 
   5:         ,data.list[j].str2 
   6:         ,data.list[j].str3 
   7:         ,data.list[j].str4 
   8:         ,data.list[j].str5); 
   9:     } 
  10:     str = str.concat("\n"); 
  11: } 

5.str=str+a

   1: var str = ""; 
   2: for (var i = 0; i < number; i++) { 
   3:     for (var j = 0; j < length; j++) { 
   4:         str = str + data.list[j].str1; 
   5:         str = str + data.list[j].str2; 
   6:         str = str + data.list[j].str3; 
   7:         str = str + data.list[j].str4; 
   8:         str = str + data.list[j].str5; 
   9:     } 
  10:     str = str + "\n"; 
  11: } 

6.str=String.prototype.concat(str,a,b,c,d,e)

   1: var str = ""; 
   2: for (var i = 0; i < number; i++) { 
   3:     for (var j = 0; j < length; j++) { 
   4:         str = String.prototype.concat(str,data.list[j].str1, 
   5:         data.list[j].str2, 
   6:         data.list[j].str3, 
   7:         data.list[j].str4, 
   8:         data.list[j].str5); 
   9:     } 
  10:     str = String.prototype.concat(str,"\n"); 
  11: } 

7.str=String.prototype.concat.apply(s, [a,b,c,d,e])

   1: var str = ""; 
   2: for (var i = 0; i < number; i++) { 
   3:     for (var j = 0; j < length; j++) { 
   4:         str = String.prototype.concat.apply(str, [data.list[j].str1, 
   5:         data.list[j].str2, 
   6:         data.list[j].str3, 
   7:         data.list[j].str4, 
   8:         data.list[j].str5]); 
   9:     } 
  10:     str =String.prototype.concat.apply(str,["\n"]); 
  11: } 

8.str=String.prototype.concat(str,a)

   1: var str = ""; 
   2: for (var i = 0; i < number; i++) { 
   3:     for (var j = 0; j < length; j++) { 
   4:         str = String.prototype.concat.call(str,data.list[j].str1); 
   5:         str = String.prototype.concat.call(str,data.list[j].str2); 
   6:         str = String.prototype.concat.call(str,data.list[j].str3); 
   7:         str = String.prototype.concat.call(str, data.list[j].str4); 
   8:         str = String.prototype.concat.call(str,data.list[j].str5); 
   9:     } 
  10:     str = String.prototype.concat(str, "\n"); 
  11: } 
9.arr[arr.length]
 1 var arr=[];
 2             for (var i = 0; i < number; i ++) {            
 3                 for(var j=0;j<length;j++){
 4                     arr[arr.length]=data.list[j].str1;
 5                     arr[arr.length]=data.list[j].str2;
 6                     arr[arr.length]=data.list[j].str3;
 7                     arr[arr.length]=data.list[j].str4;
 8                     arr[arr.length]=data.list[j].str5;
 9                 }
10                 arr[arr.length]="\n";
11             }
12             arr.join("");

 

目录
相关文章
|
3月前
|
JavaScript 前端开发
JS几种拼接字符串的方法
JS几种拼接字符串的方法
62 1
|
5月前
|
存储 JavaScript 前端开发
JS上传文件(base64字符串和二进制文件流)
这篇文章介绍了两种JavaScript文件上传的方法:使用FileReader对象将文件读取为base64字符串上传,以及使用FormData对象以二进制文件流的形式上传文件,包括如何处理文件选择、读取和上传的详细代码示例。
579 2
JS上传文件(base64字符串和二进制文件流)
|
4月前
|
JavaScript
js 解析 byte数组 成字符串
js 解析 byte数组 成字符串
101 5
|
3天前
|
JavaScript 前端开发 开发者
JavaScript字符串的常用方法
在JavaScript中,字符串处理是一个非常常见的任务。JavaScript提供了丰富的字符串操作方法,使开发者能够高效地处理和操作字符串。本文将详细介绍JavaScript字符串的常用方法,并提供示例代码以便更好地理解和应用这些方法。
32 13
|
2月前
|
JavaScript 前端开发 数据处理
模板字符串和普通字符串在浏览器和 Node.js 中的性能表现是否一致?
综上所述,模板字符串和普通字符串在浏览器和 Node.js 中的性能表现既有相似之处,也有不同之处。在实际应用中,需要根据具体的场景和性能需求来选择使用哪种字符串处理方式,以达到最佳的性能和开发效率。
|
2月前
|
JavaScript 前端开发 索引
JavaScript学习第二章--字符串
本文介绍了JavaScript中的字符串处理,包括普通字符串和模板字符串的使用方法及常见字符串操作方法如`charAt`、`concat`、`endsWith`等,适合前端学习者参考。作者是一位热爱前端技术的大一学生,专注于分享实用的编程技巧。
34 2
|
3月前
|
存储 JavaScript 前端开发
JavaScript 字符串(String) 对象
JavaScript 字符串(String) 对象
51 3
|
4月前
|
JavaScript 前端开发
javascript创建字符串
javascript创建字符串
|
4月前
|
JavaScript 前端开发
如何在JavaScript中替换字符串:一篇详细指南
如何在JavaScript中替换字符串:一篇详细指南
|
4月前
|
存储 JavaScript
js切割截取字符串方法
js切割截取字符串方法
64 2