再论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 相关文章推荐
兼容ie和firefox js关闭代码
Dec 11 Javascript
js中onload与onunload的使用示例
Aug 25 Javascript
Jquery的hide及toggle方法让超链接慢慢消失
Sep 06 Javascript
JavaScript中使用typeof运算符需要注意的几个坑
Nov 08 Javascript
jQuery使用ajax跨域获取数据的简单实例
May 18 Javascript
使用plupload自定义参数实现多文件上传
Jul 19 Javascript
Bootstrap实现提示框和弹出框效果
Jan 11 Javascript
详解探索 vuex 2.0 以及使用 vuejs 2.0 + vuex 2.0 构建记事本应用
Jun 16 Javascript
Vue组件中prop属性使用说明实例代码详解
May 31 Javascript
jQuery实现常见的隐藏与展示列表效果示例
Jun 04 jQuery
Nuxt默认模板、默认布局和自定义错误页面的实现
May 11 Javascript
Vue包大小优化的实现(从1.72M到94K)
Feb 18 Vue.js
再论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
joomla数据库操作示例代码
2016/01/06 PHP
PHP扩展框架之Yaf框架的安装与使用
2016/05/18 PHP
CI框架实现框架前后端分离的方法详解
2016/12/30 PHP
PHP简单实现遍历目录下特定文件的方法小结
2017/05/22 PHP
php实现的错误处理封装类实例
2017/06/20 PHP
Laravel中服务提供者和门面模式的入门介绍
2017/11/06 PHP
Add a Formatted Table to a Word Document
2007/06/15 Javascript
AJAX使用了UpdatePanel后无法使用alert弹出脚本
2010/04/02 Javascript
JavaScript下利用fso判断文件是否存在的代码
2010/12/11 Javascript
js nextSibling属性和previousSibling属性概述及使用注意
2013/02/16 Javascript
JS冒泡事件的快速解决方法
2013/12/16 Javascript
jquery插件lazyload.js延迟加载图片的使用方法
2014/02/19 Javascript
javascript实现延时显示提示框特效代码
2016/04/27 Javascript
angularjs 表单密码验证自定义指令实现代码
2016/10/27 Javascript
AngularJS表单提交实例详解
2017/02/18 Javascript
ionic 自定义弹框效果
2017/06/27 Javascript
微信小程序自定义yPicker组件实现省市区三级联动功能
2020/10/29 Javascript
[41:08]2014 DOTA2国际邀请赛中国区预选赛 HGT VS NE
2014/05/22 DOTA
Python的Flask框架中@app.route的用法教程
2015/03/31 Python
深入探究Python中变量的拷贝和作用域问题
2015/05/05 Python
Python判断是否json是否包含一个key的方法
2018/12/31 Python
PyTorch中permute的用法详解
2019/12/30 Python
python同时遍历两个list用法说明
2020/05/02 Python
Django实现微信小程序支付的示例代码
2020/09/03 Python
CSS3实现时间轴效果
2016/07/11 HTML / CSS
css3 矩阵的使用详解
2018/03/20 HTML / CSS
html5拖拽应用记录及注意点
2020/05/27 HTML / CSS
美国便宜的横幅和标志印刷在线:Best of Signs
2019/05/29 全球购物
Ariat英国官网:为世界顶级马术运动员制造最优质的鞋类和服装
2020/02/14 全球购物
大学生应聘推荐信范文
2013/11/19 职场文书
《夕阳真美》教学反思
2014/04/27 职场文书
单身证明范本
2015/06/15 职场文书
2015年卫生局工作总结
2015/07/24 职场文书
世界上超棒的8种逻辑思维
2019/08/06 职场文书
解决Redis启动警告问题
2022/02/24 Redis
Android基础入门之dataBinding的简单使用教程
2022/06/21 Java/Android