再论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 相关文章推荐
javascript学习笔记(三)显示当时时间的代码
Apr 08 Javascript
jQuery窗口、文档、网页各种高度的精确理解
Jul 02 Javascript
node.js中的fs.fchown方法使用说明
Dec 16 Javascript
限制上传文件大小和格式的jQuery插件实例
Jan 24 Javascript
javascript js 操作数组 增删改查的简单实现
Jun 20 Javascript
深入理解 JavaScript 中的 JSON
Apr 06 Javascript
cropper js基于vue的图片裁剪上传功能的实现代码
Mar 01 Javascript
js实现前面自动补全位数的方法
Oct 10 Javascript
创建Vue项目以及引入Iview的方法示例
Dec 03 Javascript
vue项目打包之后背景样式丢失的解决方案
Jan 17 Javascript
使用Vue调取接口,并渲染数据的示例代码
Oct 28 Javascript
Bootstrap table 服务器端分页功能实现方法示例
Jun 01 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
PHP不使用递归的无限级分类简单实例
2016/11/05 PHP
PHP序列化的四种实现方法与横向对比
2018/11/29 PHP
什么是PHP7中的孤儿进程与僵尸进程
2019/04/14 PHP
PHP数组对象与Json转换操作实例分析
2019/10/22 PHP
JavaScript定义类的几种方式总结
2014/01/06 Javascript
node.js实现多图片上传实例
2014/06/03 Javascript
JS中使用变量保存arguments对象的方法
2016/06/03 Javascript
js简单判断flash是否加载完成的方法
2016/06/21 Javascript
js判断浏览器是否支持严格模式的方法
2016/10/04 Javascript
JS获取本周周一,周末及获取任意时间的周一周末功能示例
2017/02/09 Javascript
原生JS实现跑马灯效果
2017/02/20 Javascript
jQuery Plupload上传插件的使用
2017/04/19 jQuery
BootStrap表单时间选择器详解
2017/05/09 Javascript
运用jQuery写的验证表单(实例讲解)
2017/07/06 jQuery
vue实现页面加载动画效果
2017/09/19 Javascript
Vue验证码60秒倒计时功能简单实例代码
2018/06/22 Javascript
JavaScript简单实现的仿微博留言功能示例
2019/01/17 Javascript
Vue组件通信的几种实现方法
2019/04/25 Javascript
Postman参数化实现过程及原理解析
2020/08/13 Javascript
vue $router和$route的区别详解
2020/12/02 Vue.js
利用 Chrome Dev Tools 进行页面性能分析的步骤说明(前端性能优化)
2021/02/24 Javascript
Python实现备份文件实例
2014/09/16 Python
Python解析nginx日志文件
2015/05/11 Python
python 环境变量和import模块导入方法(详解)
2017/07/11 Python
python 字符串常用函数详解
2019/09/11 Python
Python hashlib模块实例使用详解
2019/12/24 Python
python实现逆滤波与维纳滤波示例
2020/02/26 Python
利用Python脚本批量生成SQL语句
2020/03/04 Python
Django权限设置及验证方式
2020/05/13 Python
python实现定时发送邮件
2020/12/23 Python
浅谈html5与APP混合开发遇到的问题总结
2018/03/20 HTML / CSS
中职应届生会计求职信
2013/10/23 职场文书
村干部培训方案
2014/05/02 职场文书
迟到检讨书2000字(精选篇)
2014/10/07 职场文书
2015年政府采购工作总结
2015/05/21 职场文书
公司出差管理制度范本
2015/08/05 职场文书