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


Posted in Javascript onMarch 05, 2011

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浏览器下的测试结果
浏览器 copyByOperator copyByArray
IE 6 1780.4ms 9.5ms
IE 7 1754.6ms 7.7ms
IE 8 1.6ms 9.4ms

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

2.4 各种浏览器下的测试

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

各种浏览器的测试结果
浏览器 copyByOperator copyByArray
IE 8 21.8ms 54.7ms
Firefox 3.6 40.9ms 27.9ms
Chrome 4 4.4ms 10.9ms
Safari 4.0.5 41.6ms 34.6ms
Opera 10.50 33.1ms 23ms

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

3 总结

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

Javascript 相关文章推荐
js 深拷贝函数
Dec 04 Javascript
js RuntimeObject() 获取ie里面自定义函数或者属性的集合
Nov 23 Javascript
javascript-表格排序(降序/反序)实现介绍(附图)
May 30 Javascript
javascript判断非数字的简单例子
Jul 18 Javascript
基于jquery实现的定时显示与隐藏div广告的实现代码
Aug 22 Javascript
理解javascript模块化
Mar 28 Javascript
JS中append字符串包含onclick无效传递参数失败的解决方案
Dec 26 Javascript
原生js实现可拖拽效果
Feb 28 Javascript
jQuery中用on绑定事件时需注意的事项
Mar 19 Javascript
JS闭包的几种常见形式实例详解
Sep 16 Javascript
elementui的默认样式修改方法
Feb 23 Javascript
Vue在页面数据渲染完成之后的调用方法
Sep 11 Javascript
再论Javascript的类继承
Mar 05 #Javascript
Array的push与unshift方法性能比较分析
Mar 05 #Javascript
js定义对象或数组直接量时各浏览器对多余逗号的处理(json)
Mar 05 #Javascript
判断用户是否在线的代码
Mar 05 #Javascript
判断用户的在线状态 onbeforeunload事件
Mar 05 #Javascript
在多个页面使用同一个HTML片段《续》
Mar 04 #Javascript
在多个页面使用同一个HTML片段的代码
Mar 04 #Javascript
You might like
世界上第一台立体声收音机
2021/03/01 无线电
PHP中的表达式简述
2016/05/29 PHP
jQuery 1.0.4 - New Wave Javascript(js源文件)
2007/01/15 Javascript
IE与Firefox下javascript getyear年份的兼容性写法
2007/12/20 Javascript
jquery实现div拖拽宽度示例代码
2013/07/31 Javascript
Jquery EasyUI的添加,修改,删除,查询等基本操作介绍
2013/10/11 Javascript
JavaScript中的逻辑判断符&amp;&amp;、||与!介绍
2014/12/31 Javascript
详解Angular 4.x Injector
2017/05/04 Javascript
3种vue组件的书写形式
2017/11/29 Javascript
angular2 ng2-file-upload上传示例代码
2018/08/23 Javascript
使用RxJS更优雅地进行定时请求详析
2019/06/02 Javascript
Vue+Node服务器查询Mongo数据库及页面数据传递操作实例分析
2019/12/20 Javascript
基于Vue.js+Nuxt开发自定义弹出层组件
2020/10/09 Javascript
[02:07]2018DOTA2亚洲邀请赛主赛事第三日五佳镜头 fy极限反杀
2018/04/06 DOTA
[48:48]完美世界DOTA2联赛PWL S3 Magama vs GXR 第一场 12.19
2020/12/24 DOTA
Python监控主机是否存活并以邮件报警
2015/09/22 Python
Python 数据结构之队列的实现
2017/01/22 Python
详解【python】str与json类型转换
2019/04/29 Python
django 自定义filter 判断if var in list的例子
2019/08/20 Python
Django 对IP访问频率进行限制的例子
2019/08/30 Python
基于Python执行dos命令并获取输出的结果
2019/12/30 Python
tensorflow 只恢复部分模型参数的实例
2020/01/06 Python
python如何获得list或numpy数组中最大元素对应的索引
2020/11/16 Python
Flask处理Web表单的实现方法
2021/01/31 Python
HTML5重塑Web世界它将如何改变互联网
2012/12/17 HTML / CSS
如何让pre和textarea等HTML元素去掉滚动条自动换行自适应文本内容高度
2019/08/01 HTML / CSS
教师通用专业自荐书范文
2014/02/11 职场文书
国际贸易专业个人职业生涯规划
2014/02/15 职场文书
金融学专业大学生职业生涯规划
2014/03/07 职场文书
毕业生就业协议书
2014/04/11 职场文书
学校安全责任书
2014/04/14 职场文书
党员活动日总结
2014/05/05 职场文书
职工食堂管理制度
2015/08/06 职场文书
银行柜员优质服务心得体会
2016/01/22 职场文书
CSS基础详解
2021/10/16 HTML / CSS
MySQL数据库表约束讲解
2022/06/21 MySQL