再论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 相关文章推荐
3Z版基于jquery的图片复选框(asp.net+jquery)
Apr 12 Javascript
表格单元格交错着色实现思路及代码
Apr 01 Javascript
Table冻结表头示例代码
Aug 20 Javascript
下拉列表选择项的选中在不同浏览器中的兼容性问题探讨
Sep 18 Javascript
使用jQuery中的wrap()函数操作HTML元素的教程
May 24 Javascript
bootstrap导航、选项卡实现代码
Dec 28 Javascript
原生js实现下拉框功能(支持键盘事件)
Jan 13 Javascript
JavaScript实现水平进度条拖拽效果
Jan 18 Javascript
AngularJS实现的获取焦点及失去焦点时的表单验证功能示例
Oct 25 Javascript
layui 数据表格 根据值(1=业务,2=机构)显示中文名称示例
Oct 26 Javascript
详解搭建一个vue-cli的移动端H5开发模板
Jan 17 Javascript
利用Vue的v-for和v-bind实现列表颜色切换
Jul 17 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
hessian 在PHP中的使用介绍
2010/12/13 PHP
摘自织梦CMS中的图片处理类
2015/08/08 PHP
php基于单例模式封装mysql类完整实例
2016/10/18 PHP
Laravel多用户认证系统示例详解
2018/03/13 PHP
PHP的静态方法与普通方法用法实例分析
2019/09/26 PHP
Javascript的IE和Firefox兼容性汇编
2006/07/01 Javascript
Firefox 无法获取cssRules 的解决办法
2006/10/11 Javascript
重写javascript中window.confirm的行为
2012/10/21 Javascript
使用原生js封装webapp滑动效果(惯性滑动、滑动回弹)
2014/05/06 Javascript
JQuery标签页效果实例详解
2015/12/24 Javascript
BootstrapTable与KnockoutJS相结合实现增删改查功能【一】
2016/05/10 Javascript
Bootstrap CDN和本地化环境搭建
2016/10/26 Javascript
JavaScript中localStorage对象存储方式实例分析
2017/01/12 Javascript
使用微信内嵌H5网页解决JS倒计时失效问题
2017/01/13 Javascript
详解支持Angular 2的表格控件
2017/01/19 Javascript
浅谈Vue-cli单文件组件引入less,sass,css样式的不同方法
2018/03/13 Javascript
微信小程序获取位置展示地图并标注信息的实例代码
2019/09/01 Javascript
vue使用i18n实现国际化的方法详解
2019/09/05 Javascript
[49:31]TFT vs Mski Supermajor小组赛C组 BO3 第一场 6.3
2018/06/04 DOTA
[02:16]完美世界DOTA2联赛PWL S3 集锦第三期
2020/12/21 DOTA
CentOS 6.5中安装Python 3.6.2的方法步骤
2017/12/03 Python
Python实现九宫格式的朋友圈功能内附“马云”朋友圈
2019/05/07 Python
python中字典按键或键值排序的实现代码
2019/08/27 Python
Python 实现一个手机号码获取妹子名字的功能
2019/09/25 Python
Python偏函数实现原理及应用
2020/11/20 Python
机械制造与自动化应届生求职信
2013/11/16 职场文书
运动会稿件100字
2014/02/21 职场文书
端午节活动策划方案
2014/03/09 职场文书
建筑工地大门标语
2014/06/18 职场文书
教育实践活动对照检查材料
2014/09/23 职场文书
本溪水洞导游词
2015/02/11 职场文书
幼儿园园长六一致辞
2015/07/31 职场文书
餐厅营销的秘密:为什么老顾客会流水?
2019/08/08 职场文书
导游词之河北滦平金山岭长城
2019/10/16 职场文书
微信小程序实现录音Record功能
2021/05/09 Javascript
vue的项目如何打包上线
2022/04/13 Vue.js