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 相关文章推荐
Knockoutjs快速入门(经典)
Dec 24 Javascript
jquery load事件(callback/data)使用方法及注意事项
Feb 06 Javascript
js实现连续英文字符自动换行兼容ie6 ie7和firefox
Sep 06 Javascript
浏览器兼容console对象的简要解决方案分享
Oct 24 Javascript
jQuery使用drag效果实现自由拖拽div
Jun 11 Javascript
js实现卡片式项目管理界面UI设计效果
Dec 08 Javascript
javascript绘制漂亮的心型线效果完整实例
Feb 02 Javascript
动态创建Angular组件实现popup弹窗功能
Sep 15 Javascript
详解.vue文件中style标签的几个标识符
Jul 17 Javascript
Vue 中对图片地址进行拼接的方法
Sep 03 Javascript
简单说说angular.json文件的使用
Oct 29 Javascript
vue created钩子函数与mounted钩子函数的用法区别
Nov 05 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
《破坏领主》销量已超100万 未来将继续开发新内容
2020/03/08 其他游戏
曾在DC漫画界反派角色扮演的演员,谁才是你心目中的小丑之王?
2020/04/09 欧美动漫
PHP添加MySQL数据记录代码
2008/06/07 PHP
php 获取select下拉列表框的值
2010/05/08 PHP
phpmyadmin3 安装配置图解教程
2012/03/29 PHP
php数组去重的函数代码
2013/02/03 PHP
PHP session_start()问题解疑(详细介绍)
2013/07/05 PHP
php数组比较实现查找连续数的方法
2015/07/29 PHP
XP折叠菜单&amp;仿QQ2006菜单
2006/12/16 Javascript
图片自动缩小的js代码,用以防止图片撑破页面
2007/03/12 Javascript
window.open关于浏览器拦截问题分析及解决方法
2013/02/05 Javascript
jQuery阻止事件冒泡具体实现
2013/10/11 Javascript
深入理解Javascript中的循环优化
2013/11/09 Javascript
jquery幻灯片插件bxslider样式改进实例
2014/10/15 Javascript
jQuery弹层插件jquery.fancybox.js用法实例
2016/01/22 Javascript
JavaScript提升性能的常用技巧总结【经典】
2016/06/20 Javascript
用jquery获取自定义的标签属性的值简单实例
2016/09/17 Javascript
AngularJs 利用百度地图API 定位当前位置 获取地址信息
2017/01/18 Javascript
ajax +NodeJS 实现图片上传实例
2017/06/06 NodeJs
JavaScript引用类型Object常见用法实例分析
2018/08/08 Javascript
vue响应式系统之observe、watcher、dep的源码解析
2019/04/09 Javascript
小程序简单两栏瀑布流效果的实现
2019/12/18 Javascript
vue-autoui自匹配webapi的UI控件的实现
2020/03/20 Javascript
[02:12]探秘2016国际邀请赛中国区预选赛选手房间
2016/06/25 DOTA
OpenCV图像颜色反转算法详解
2019/05/13 Python
详解Python并发编程之创建多线程的几种方法
2019/08/23 Python
解决Python二维数组赋值问题
2019/11/28 Python
为什么说python适合写爬虫
2020/06/11 Python
keras:model.compile损失函数的用法
2020/07/01 Python
python exit出错原因整理
2020/08/31 Python
采用专利算法搜索最廉价的机票:CheapAir
2016/09/10 全球购物
官僚主义现象查摆问题整改措施
2014/10/04 职场文书
社区班子个人对照检查材料思想汇报
2014/10/07 职场文书
商场收银员岗位职责
2015/04/07 职场文书
Python 语言实现六大查找算法
2021/06/30 Python
JavaScript阻止事件冒泡的方法
2021/12/06 Javascript