JavaScript组合拼接字符串的效率对比测试


Posted in Javascript onNovember 06, 2014

在脚本开发过程中,经常会按照某个规则,组合拼接出一个大字符串进行输出。比如写脚本控件时控制整个控件的外观的HTML标签输出,比如AJAX里得到服务器端的回传值后动态分析创建HTML标签时,不过这里我就不讨论拼接字符串的具体应用了,我只是想在这里讨论一下拼接的效率。

字符串的拼接在我们写代码的时候都是用“+=”这个运算符,s += String; 这是我们最为熟知的写法,不知道大家有没有注意过没有,在组合的字符串容量有几十K甚至几百K的时候,脚本执行起来很慢,CPU使用率狂高,例如:

    var str = "01234567891123456789212345678931234567894123456789";

        str+= "51234567896123456789712345678981234567899123456789/n";

    var result = "";

    for(var i=0; i<2000; i++) result += str;

就这么一步操作,产生的结果字符串是200K,耗时是1.1秒(这个与电脑配置有关),CPU的峰值100%。(为了更直观地看到效果,我多做了些循环)。可想而知就这么一步操作就消耗了我一秒多的时间,再加上其它的代码的时间消耗,那整个脚本块的执行时间就难以忍受了。那有没有优化的方案呢?还有其它的方法吗?答案当然是有的,否则我写这篇文章就是废话。

更快的方式就是使用数组,在循环拼接的时候不是相接拼接到某个字符串里去,而是把字符串放到一个数组里,最后用数组.join("") 得到结果字符串,代码示例:

    var str = "01234567891123456789212345678931234567894123456789";

        str+= "51234567896123456789712345678981234567899123456789/n";

    var result = "", a = new Array();

    for(var i=0; i<2000; i++) a[i] = str;

    result = a.join(""); a = null;

大家可以测试测试,组合出一个相同大小的字符串所消耗的时间,我这里测试出来的结果是:<15毫秒,请注意,它的单位是毫秒,也就是说组合出这么一个200K的字符串,两种模式的时间消耗是差不多两个数量级。这意味着什么?意味着后者已经工作结束吃完中饭回来,前者还在做着苦力。我写一个测试页面,大家可以把下面这些代码拷贝下来另存为一个HTM文件在网页里打开自己来测试一下两者之间的效率差,反正我测试的是前者要半分钟才能完成的事,后者0.07秒就搞定了(循环10000次)。

<body>

字符串拼接次数<input id="totle" value="1000" size="5" maxlength="5">

<input type="button" value="字符串拼接法" onclick="method1()">

<input type="button" value="数组赋值join法" onclick="method2()"><br>

<div id="method1"> </div>

<div id="method2"> </div>

<textarea id="show" style="width: 100%; height: 400"></textarea>

<SCRIPT LANGUAGE="JavaScript">

<!--

//这个被拼接的字符串长是100字节 author: meizz

var str = "01234567891123456789212345678931234567894123456789";

    str+= "51234567896123456789712345678981234567899123456789/n";
//方法一

function method1()

{

    var result = "";

    var totle  = parseInt(document.getElementById("totle").value);

    var n = new Date().getTime();
    for(var i=0; i<totle; i++)

    {

        result += str;

    }
    document.getElementById("show").value = result;

    var s = "字符串拼接法:拼接后的大字符串长 "+ result.length +"字节,"+

            "拼接耗时 "+ (new Date().getTime()-n) +"毫秒!";

    document.getElementById("method1").innerHTML = s;

}
//方法二

function method2()

{

    var result = "";

    var totle  = parseInt(document.getElementById("totle").value);

    var n = new Date().getTime();
    var a = new Array();

    for(var i=0; i<totle; i++)

    {

        a[i] = str;

    }

    result = a.join(""); a=null;
    document.getElementById("show").value = result;

    var s = "数组赋值join法:拼接后的大字符串长 "+ result.length +"字节,"+

            "拼接耗时 "+ (new Date().getTime()-n) +"毫秒!";

    document.getElementById("method2").innerHTML = s;

}

//-->

</SCRIPT>

最后我再说几句,是不是以后字符串拼接就一律使用数组join呢?这个要看你的实际需求了,就普通的几个或者K级的字节的组合就没有必要使用数组法了,因为开数组变量也是有消耗的。若有几K以上的字符串组合,那就是数组的效率高了。

IE 6.0:

字符串拼接法:拼接后的大字符串长 1010000字节,拼接耗时 22089毫秒!
数组赋值join法:拼接后的大字符串长 1010000字节,拼接耗时 218毫秒!

Firefox 1.0:

字符串拼接法:拼接后的大字符串长 1010000字节,拼接耗时 1044毫秒!
数组赋值join法:拼接后的大字符串长 1010000字节,拼接耗时 1044毫秒!

Mozilla 1.7:

字符串拼接法:拼接后的大字符串长 1010000字节,拼接耗时 1045毫秒!
数组赋值join法:拼接后的大字符串长 1010000字节,拼接耗时 1044毫秒!

Netscape 7.0:

字符串拼接法:拼接后的大字符串长 1010000字节,拼接耗时 10273毫秒!
数组赋值join法:拼接后的大字符串长 1010000字节,拼接耗时 1138毫秒!

Opera 7.54:

字符串拼接法:拼接后的大字符串长 1010000字节,拼接耗时 6968毫秒!
数组赋值join法:拼接后的大字符串长 1010000字节,拼接耗时 6922毫秒!

循环10000次的测试结果表明在IE和Netscape里可以大大提高效率,而在Firefox Mozilla Opera 里两种方法耗时基本相近,这些数据足可以判定数组join法优于传统字符串拼接。

Javascript 相关文章推荐
js null undefined 空区别说明
Jun 13 Javascript
获得Javascript对象属性个数的示例代码
Nov 21 Javascript
谈谈Jquery ajax中success和complete有哪些不同点
Nov 20 Javascript
JavaScript的ExtJS框架中数面板TreePanel的使用实例解析
May 21 Javascript
Bootstrap CSS布局之表单
Dec 17 Javascript
通过fastclick源码分析彻底解决tap“点透”
Dec 24 Javascript
express+mockjs实现模拟后台数据发送功能
Jan 07 Javascript
pm2发布node配置文件ecosystem.json详解
May 15 Javascript
layer页面跳转,获取html子节点元素的值方法
Sep 27 Javascript
微信公众号H5之微信分享常见错误和问题(小结)
Nov 14 Javascript
小程序自定义弹框效果
Nov 16 Javascript
浅谈TypeScript 索引签名的理解
Oct 16 Javascript
5个书写JavaScript代码的坏习惯,看看你中枪了没?
Nov 06 #Javascript
javascript解析json实例详解
Nov 05 #Javascript
JavaScript中发布/订阅模式的简单实例
Nov 05 #Javascript
JavaScript不刷新实现浏览器的前进后退功能
Nov 05 #Javascript
Javascript检查图片大小不要让大图片撑破页面
Nov 04 #Javascript
node.js开发中使用Node Supervisor实现监测文件修改并自动重启应用
Nov 04 #Javascript
node.js中Socket.IO的进阶使用技巧
Nov 04 #Javascript
You might like
php+dbfile开发小型留言本
2006/10/09 PHP
Destoon旺旺无法正常显示,点击提示“会员名不存在”的解决办法
2014/06/21 PHP
php使用fsockopen函数发送post,get请求获取网页内容的方法
2014/11/15 PHP
PHP微信开发之查询微信精选文章
2016/06/23 PHP
js iframe跨域访问(同主域/非同主域)分别深入介绍
2013/01/24 Javascript
简单易用的倒计时js代码
2014/08/04 Javascript
自编jQuery插件实现模拟alert和confirm
2014/09/01 Javascript
JavaScript实现的多个图片广告交替显示效果代码
2015/09/04 Javascript
js获取鼠标位置实例详解
2015/12/09 Javascript
javascript实现2016新年版日历
2016/01/25 Javascript
JS简单循环遍历json数组的方法
2016/04/22 Javascript
js 中rewrap-ajax.js插件实例代码
2017/10/20 Javascript
Nodejs 发布自己的npm包并制作成命令行工具的实例讲解
2018/05/15 NodeJs
vue项目实现github在线预览功能
2018/06/20 Javascript
vuejs数据超出单行显示更多,点击展开剩余数据实例
2019/05/05 Javascript
js getBoundingClientRect使用方法详解
2019/07/17 Javascript
vue中的过滤器及其时间格式化问题
2020/04/09 Javascript
[00:47]DOTA2荣耀之路6:玩不了啦!
2018/05/30 DOTA
python使用新浪微博api上传图片到微博示例
2014/01/10 Python
Python发送以整个文件夹的内容为附件的邮件的教程
2015/05/06 Python
Python环境使用OpenCV检测人脸实现教程
2020/10/19 Python
详解Python流程控制语句
2020/10/28 Python
详解Python遍历列表时删除元素的正确做法
2021/01/07 Python
三星英国官网:Samsung英国
2018/09/25 全球购物
施华洛世奇巴西官网:SWAROVSKI巴西
2019/12/03 全球购物
进程的查看和调度分别使用什么命令
2015/03/25 面试题
大专学生推荐信范文
2013/11/19 职场文书
编辑找工作求职信分享
2014/01/03 职场文书
总会计师岗位职责
2014/02/19 职场文书
微笑面对生活演讲稿
2014/05/13 职场文书
2014最新版群众路线四风整改措施
2014/09/24 职场文书
幼儿园法制宣传日活动总结
2014/11/01 职场文书
python 利用PyAutoGUI快速构建自动化操作脚本
2021/05/31 Python
Windows下redis下载、redis安装及使用教程
2021/06/02 Redis
一文带你探究MySQL中的NULL
2021/11/11 MySQL
Python语法学习之进程的创建与常用方法详解
2022/04/08 Python