再论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 的Document属性和方法集合
Jan 25 Javascript
纯js实现瀑布流展现照片(自动适应窗口大小)
Apr 08 Javascript
用js实现控件的隐藏及style.visibility的使用
Jun 14 Javascript
jquery拖拽效果完整实例(附demo源码下载)
Jan 14 Javascript
angularjs ui-router中路由的二级嵌套
Mar 10 Javascript
vuejs实现递归树型菜单组件
Jan 13 Javascript
vue init webpack 建vue项目报错的解决方法
Sep 29 Javascript
解决JavaScript中0.1+0.2不等于0.3问题
Oct 23 Javascript
详解JavaScript中typeof与instanceof用法
Oct 24 Javascript
vue-cli3中vue.config.js配置教程详解
May 29 Javascript
ant-design-vue按需加载的坑的解决
May 14 Javascript
使用vue编写h5公众号跳转小程序的实现代码
Nov 27 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
php empty函数判断mysql表单是否为空
2010/04/12 PHP
PHPAnalysis中文分词类详解
2014/06/13 PHP
PHP实现适用于自定义的验证码类
2016/06/15 PHP
PHP使用第三方即时获取物流动态实例详解
2017/04/27 PHP
Prototype使用指南之range.js
2007/01/10 Javascript
javascript 解析url的search方法
2010/02/09 Javascript
JavaScript 学习技巧
2010/02/17 Javascript
JavaScript Window浏览器对象模型方法与属性汇总
2015/04/20 Javascript
判断数组是否包含某个元素的js函数实现方法
2016/05/19 Javascript
JavaScript中用let语句声明作用域的用法讲解
2016/05/20 Javascript
深入理解Commonjs规范及Node模块实现
2017/05/17 Javascript
使用axios实现上传图片进度条功能
2017/12/21 Javascript
Angular4 组件通讯方法大全(推荐)
2018/07/12 Javascript
vue.js 2.*项目环境搭建、运行、打包发布的详细步骤
2019/05/01 Javascript
TypeScript类型声明书写详解
2019/08/28 Javascript
JavaScript数值类型知识汇总
2019/11/17 Javascript
js判断鼠标移入移出方向的方法
2020/06/24 Javascript
Vue 的 v-model用法实例
2020/11/23 Vue.js
JavaScript中clientWidth,offsetWidth,scrollWidth的区别
2021/01/25 Javascript
python33 urllib2使用方法细节讲解
2013/12/03 Python
python3爬取各类天气信息
2018/02/24 Python
Python计算开方、立方、圆周率,精确到小数点后任意位的方法
2018/07/17 Python
Python SQL查询并生成json文件操作示例
2018/08/17 Python
html5的画布canvas——画出简单的矩形、三角形实例代码
2013/06/09 HTML / CSS
水芝澳美国官网:H2O Plus
2016/10/15 全球购物
苹果音乐订阅:Apple Music
2018/08/02 全球购物
如何现实servlet的单线程模式
2014/08/05 面试题
《社戏》教学反思
2014/04/15 职场文书
公司门卫工作职责
2014/06/28 职场文书
国际残疾人日广播稿范文
2014/10/09 职场文书
秦兵马俑导游词
2015/02/02 职场文书
心理健康教育主题班会
2015/08/13 职场文书
HTML+css盒子模型案例(圆,半圆等)“border-radius” 简单易上手
2021/05/10 HTML / CSS
JavaScript原始值与包装对象的详细介绍
2021/05/11 Javascript
Python List remove()实例用法详解
2021/08/02 Python
mysql下的max_allowed_packet参数设置详解
2022/02/12 MySQL