再论Javascript下字符串连接的性能

作者:heero 来源:heero博客 时间:2010-06-26 13:13:00 

这是个老话题了,之所以再拿出来说,是因为浏览器一直在进步,以前最好的方法现在不一定是最好的。

1 如何进行字符串连接?

首先让我们来回顾一下字符串连接的两种常用方法:

1.1 使用字符串连接运算符

常用的语言(如Java、C#、PHP等)都有字符串连接运算符,Javascript也不例外,代码示例:

var str = "";
str = str + "a";

1.2 使用数组

在常用的语言中,字符串连接运算的性能普遍不高,为此在C#中就专门提供了StringBuilder(Java中提供了StringBuffer)用于连接字符串。而在Javascript中就出现了通过Array模拟StringBuilder的方案

var str = [];
for (var i = 0; i < 100; i++) {
  str[i] = "12345";
}
str = str.join("");

2 测试

下面通过复制字符串的过程来测试两种方法的性能:

2.1 通过字符串连接运算符进行复制:

function copyByOperator(str, times) {
  var newStr = "";
  for (var i = 0; i < times; i++) {
    newStr += str;
  }
  return newStr;
}

2.2 通过数组进行复制:

function copyByArray(str, times) {
  var newStr = [];
  for (var i = 0; i < times; i++) {
    newStr[i] = str;
  }
  return newStr.join("");
}

str采用一段固定的HTML字符串,长度是61。

2.3 IE下的测试

考虑到IE的性能比较差,先用小的times值(6000)在IE 6、IE 7和IE 8下面测试。运行10次后取平均值,结果如下:

IE浏览器下的测试结果
浏览器copyByOperatorcopyByArray
IE 61780.4ms9.5ms
IE 71754.6ms7.7ms
IE 81.6ms9.4ms

IE6、7与IE8的测试结果相距甚远,很明显地,IE 8对字符串连接运算进行了优化,效率已经高于数组复制法

2.4 各种浏览器下的测试

下面再用比较大的times值(50000)对最新版本的各种浏览器进行测试。

各种浏览器的测试结果
浏览器copyByOperatorcopyByArray
IE 821.8ms54.7ms
Firefox 3.640.9ms27.9ms
Chrome 44.4ms10.9ms
Safari 4.0.541.6ms34.6ms
Opera 10.5033.1ms23ms

这个结果真是出人意料。IE 8下的字符串连接运算竟然把Chrome以外的浏览器都打败了,那些老说IE性能低下的可要注意点了。而在Chrome下也出现了字符串连接运算比数组复制法高效的情况。

3 总结

浏览器的性能在不断地提高,作为前端工程师,也要适时调整Javascript程序的优化策略,以获得最佳的性能。

标签:字符串,性能,javascript
0
投稿

猜你喜欢

  • IE下修改<p>标签的innerHTML出错

    2007-11-11 10:12:00
  • 用 XSLT 把 XML 数据生成柱状图

    2009-05-19 12:46:00
  • HTML5中 b 和 i 标签将语义化

    2008-03-16 13:43:00
  • css布局查看器

    2008-10-29 11:22:00
  • asp 各种进制转换函数

    2008-06-24 12:35:00
  • 最简洁的SQL多重查询的解决方案

    2005-09-12 16:31:00
  • phpMyAdmin 2.10.2 配置方法

    2007-08-22 08:11:00
  • 影响SQL Server性能的三个关键点

    2009-03-09 13:11:00
  • 避免使用滤镜

    2009-10-13 20:30:00
  • asp数字或者字符排序函数代码

    2011-02-24 11:00:00
  • 谈谈XHTML中CDATA

    2007-09-17 12:45:00
  • MySQL数据库的root口令恢复方法总结

    2009-08-19 09:03:00
  • asp如何做一个检索结果带链接的检索?

    2010-07-11 21:15:00
  • 如何使用图片精灵优化你的网站

    2009-07-21 11:35:00
  • ASP中Request对象获取客户端数据的顺序

    2007-09-22 10:36:00
  • 使用FORFILES命令来删除SQLServer备份的批处理

    2012-05-08 06:47:06
  • 讲解SQL Server危险扩展存储删除和恢复

    2008-12-09 14:30:00
  • DW中如何使用Library

    2007-02-03 11:39:00
  • Perl下应当如何连接Access数据库

    2008-12-04 13:06:00
  • 分析Silverlight Button控件布局

    2009-02-17 13:13:00
  • asp之家 网络编程 m.aspxhome.com