`
mingo
  • 浏览: 41926 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

JS组合拼接字符串的效率zz

阅读更多
经常记不住这个方法,还要去google,干脆放在自己的blog里找起来方便。


在脚本开发过程中,经常会按照某个规则,组合拼接出一个大字符串进行输出。比如写脚本控件时控制整个控件的外观的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">
分享到:
评论

相关推荐

    给定字符串J 代表石头中宝石的类型,和字符串 S代表你拥有的石头。 S 中每个字符代表了一种你拥有的石头的类型

     给定字符串J 代表石头中宝石的类型,和字符串 S代表你拥有的石头。 S 中每个字符代表了一种你拥有的石头的类型,你想知道你拥有的石头中有多少是宝石。 J 中的字母不重复,J 和 S中的所有字符都是字母。...

    base zz zz zz zz

    base zz zz zz zz zz base zz zz zz zz zz base zz zz zz zz zz base zz zz zz zz zz

    php字符串加密解密的类

    base64编码的原理是将每3个字节(24位)的数据分为4个6位组,并为每个6位组分配一个字符,范围在'AA'到'ZZ'之间,以及'/'和'='。'='字符用于填充不足6位的数据。解码过程则相反,将这些字符转换回原始的二进制数据。...

    c#截取指定长度,中英文混合字符串

    ### C# 截取指定长度的中英文混合字符串方法解析 在C#中处理文本时,经常需要对字符串进行截取操作。对于包含中文字符的字符串来说,由于一个中文字符通常占据两个字节的位置(在某些编码下),因此在进行长度判断...

    python串口发送数据与接收数据(文本转hex 接收字符串或者列表类型)

    python串口发送数据与接收数据(文本转hex 接收字符串或者列表类型)

    python源码字符串处理技术

    在提供的示例地址中,我们能够看到一串看似无序的字符和数字组合,实际上这就是我们需要提取的分享链接密钥。 使用Python进行提取的关键步骤如下: 1. 使用正则表达式来匹配地址中的密钥。这涉及到构建一个能够...

    Asp.net日期字符串格式化显示方法

    ### ASP.NET 日期字符串格式化显示方法详解 在开发基于ASP.NET的应用程序时,经常会遇到需要处理日期和时间的情况。为了使用户界面更加友好、数据更易于理解,我们需要对日期和时间进行适当的格式化处理。本文将...

    实验-数组字符串(java).docx

    在本实验中,我们将深入探讨Java中的字符串处理,主要涉及两个方面:字符串基本操作和字符串比较。首先,我们从实验内容的第一个部分开始。 1. 输出字符串的长度、计数特定字符以及截取子字符串: 实验内容1要求...

    python算法数据结构课程视频含代码之字符串1G

    根据提供的文件信息,我们可以深入探讨有关Python算法与数据结构中的字符串处理相关知识点。这段课程视频主要涉及Python语言在处理字符串时的各种技巧与方法,对于学习Python编程语言的同学来说,掌握这些知识点至关...

    C#中英文混合字符串截取函数

    1. 使用正则表达式`Regex.Replace`检查字符串中英文字符的分布,将中文字符视为两个`'zz'`字符替换,英文字符则保持不变,从而实现对字符串长度的初步估算。 2. 如果初步估算后的长度小于或等于最大长度(`maxLength...

    C#日期格式字符串的相互转换操作实例分析

    "C#日期格式字符串的相互转换操作实例分析" C#日期格式字符串的相互转换操作是一个非常重要的知识点,在实际开发中,我们经常需要将日期格式字符串转换为DateTime类型的对象,或者将DateTime类型的对象转换为日期...

    算法文档无代码浅析“最小表示法”思想在字符串循环同构问题中的应用

    标题中提到的“最小表示法”是一种解决字符串问题的算法思想,特别是在处理字符串循环同构问题时非常有用。在深入了解之前,我们首先要明白几个基本概念。 字符串循环同构是指一个字符串可以被看作是另一个字符串的...

    java基础面试题字符串的排列

    java基础面试题字符串的排列提取方式是百度网盘分享地址

    java基础面试题左旋转字符串

    java基础面试题左旋转字符串提取方式是百度网盘分享地址

    5152单片机proteus仿真和源码字符串函数string.h应用举例

    在本篇文章中,我们将深入探讨5152单片机在Proteus...同时,掌握了string.h库中的常用函数可以帮助开发者更加高效地处理字符串相关的任务,提高编程效率。希望本文能为广大电子爱好者和工程师们提供一定的参考价值。

    ZZ561401.CAB

    ZZ561401.CAB ZZ561401.CAB ZZ561401.CAB

    fizzbuzz-js:JavaScript中的FizzBu​​zz

    JavaScript中的FizzBu​​zz 问题:编写一个以一个数字作为参数的方法。 对于三的倍数,返回“嘶嘶声”,对于五的倍数,返回“嗡嗡声”。 对于三和五的倍数的数字,返回“ FizzBu​​zz”,在所有其他情况下,返回...

    txt文件读取成字符向量元胞数组

    文本文件直接按行读取为cellstr,MATLAB别的一些读取模式太zz了,这个函数直接读成字符串后面再处理了。输入参数可以是字符串标量或字符向量,应当是一个文件路径。不是的话会直接套成元胞输出 直接推荐readlines,...

    5152单片机proteus仿真和源码用P0口显示字符串常量

    在本篇文章中,我们将深入探讨如何使用5152单片机通过Proteus软件进行仿真,并利用P0端口来显示字符串常量的过程。这一技术对于初学者来说非常重要,因为它不仅涉及到硬件的设计与配置,还涉及到软件编程及调试等...

    wincc AX NF ZZ

    wincc SIMATIC WinCC是第一个使用最新的32位技术的过程监视系统,具有良好的开放性和灵活性。 从面市伊始,用户就对SIMATIC WinCC印象深刻。

Global site tag (gtag.js) - Google Analytics