再论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 相关文章推荐
经常用的图片在容器中的水平垂直居中实例
Jun 10 Javascript
JS实现很酷的水波文字特效实例
Feb 26 Javascript
更高效的使用JQuery 这里总结了8个小技巧
Apr 13 Javascript
浅谈js-FCC算法Friendly Date Ranges(详解)
Apr 10 Javascript
Angular获取手机验证码实现移动端登录注册功能
May 17 Javascript
简述vue状态管理模式之vuex
Aug 29 Javascript
使用vue点击li,获取当前点击li父辈元素的属性值方法
Sep 12 Javascript
VueCli3.0中集成MockApi的方法示例
Jul 05 Javascript
vue-cli 为项目设置别名的方法
Oct 15 Javascript
JavaScript实现Excel表格效果
Feb 07 Javascript
js禁止查看源文件屏蔽Ctrl+u/s、F12、右键等兼容IE火狐chrome
Oct 01 Javascript
vue任意关系组件通信与跨组件监听状态vue-communication
Oct 18 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 无线电
解析wamp5下虚拟机配置文档
2013/06/27 PHP
PHP使用FFmpeg获取视频播放总时长与码率等信息
2016/09/13 PHP
PHP使用mysqli操作MySQL数据库的简单方法
2017/02/04 PHP
PHP实现的简单对称加密与解密方法实例小结
2017/08/28 PHP
PHP APP微信提现接口代码
2018/09/30 PHP
Jquery+WebService 校验账号是否已被注册的代码
2010/07/12 Javascript
JavaScript XML和string相互转化实现代码
2011/07/04 Javascript
jquery获取复选框被选中的值
2014/03/22 Javascript
jquery.cookie.js实现用户登录保存密码功能的方法
2016/04/15 Javascript
如何用JavaScript实现动态修改CSS样式表
2016/05/20 Javascript
JS简单测试循环运行时间的方法
2016/09/04 Javascript
javascript内存分配原理实例分析
2017/04/10 Javascript
JS中跳出循环的示例代码
2017/09/14 Javascript
EasyUI创建人员树的实例代码
2017/09/15 Javascript
关于ES6箭头函数中的this问题
2018/02/27 Javascript
微信小程序倒计时功能实例代码
2018/07/17 Javascript
JavaScript去掉数组重复项的方法分析【测试可用】
2018/07/19 Javascript
详解Element 指令clickoutside源码分析
2019/02/15 Javascript
新手快速入门微信小程序组件库 iView Weapp
2019/06/24 Javascript
Node爬取大批量文件的方法示例
2019/06/28 Javascript
微信小程序引入VANT组件的方法步骤
2019/09/19 Javascript
vue中进行微博分享的实例讲解
2019/10/14 Javascript
vue实现购物车选择功能
2020/01/10 Javascript
JS co 函数库的含义和用法实例总结
2020/04/08 Javascript
ant-design表单处理和常用方法及自定义验证操作
2020/10/27 Javascript
javascript实现简单留言板案例
2021/02/09 Javascript
python中正则表达式的使用方法
2018/02/25 Python
关于django 数据库迁移(migrate)应该知道的一些事
2018/05/27 Python
解决pycharm启动后总是不停的updating indices...indexing的问题
2019/11/27 Python
写clone()方法时,通常都有一行代码,是什么?
2012/10/31 面试题
县级文明单位申报材料
2014/05/23 职场文书
2014年无财产无子女离婚协议书范本
2014/10/09 职场文书
2015年五一劳动节慰问信
2015/03/23 职场文书
杨善洲观后感
2015/06/04 职场文书
用 Python 元类的特性实现 ORM 框架
2021/05/19 Python