经常记不住这个方法,还要去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 中的字母不重复,J 和 S中的所有字符都是字母。...
base zz zz zz zz zz base zz zz zz zz zz base zz zz zz zz zz base zz zz zz zz zz
base64编码的原理是将每3个字节(24位)的数据分为4个6位组,并为每个6位组分配一个字符,范围在'AA'到'ZZ'之间,以及'/'和'='。'='字符用于填充不足6位的数据。解码过程则相反,将这些字符转换回原始的二进制数据。...
### C# 截取指定长度的中英文混合字符串方法解析 在C#中处理文本时,经常需要对字符串进行截取操作。对于包含中文字符的字符串来说,由于一个中文字符通常占据两个字节的位置(在某些编码下),因此在进行长度判断...
python串口发送数据与接收数据(文本转hex 接收字符串或者列表类型)
在提供的示例地址中,我们能够看到一串看似无序的字符和数字组合,实际上这就是我们需要提取的分享链接密钥。 使用Python进行提取的关键步骤如下: 1. 使用正则表达式来匹配地址中的密钥。这涉及到构建一个能够...
### ASP.NET 日期字符串格式化显示方法详解 在开发基于ASP.NET的应用程序时,经常会遇到需要处理日期和时间的情况。为了使用户界面更加友好、数据更易于理解,我们需要对日期和时间进行适当的格式化处理。本文将...
在本实验中,我们将深入探讨Java中的字符串处理,主要涉及两个方面:字符串基本操作和字符串比较。首先,我们从实验内容的第一个部分开始。 1. 输出字符串的长度、计数特定字符以及截取子字符串: 实验内容1要求...
根据提供的文件信息,我们可以深入探讨有关Python算法与数据结构中的字符串处理相关知识点。这段课程视频主要涉及Python语言在处理字符串时的各种技巧与方法,对于学习Python编程语言的同学来说,掌握这些知识点至关...
1. 使用正则表达式`Regex.Replace`检查字符串中英文字符的分布,将中文字符视为两个`'zz'`字符替换,英文字符则保持不变,从而实现对字符串长度的初步估算。 2. 如果初步估算后的长度小于或等于最大长度(`maxLength...
"C#日期格式字符串的相互转换操作实例分析" C#日期格式字符串的相互转换操作是一个非常重要的知识点,在实际开发中,我们经常需要将日期格式字符串转换为DateTime类型的对象,或者将DateTime类型的对象转换为日期...
标题中提到的“最小表示法”是一种解决字符串问题的算法思想,特别是在处理字符串循环同构问题时非常有用。在深入了解之前,我们首先要明白几个基本概念。 字符串循环同构是指一个字符串可以被看作是另一个字符串的...
java基础面试题字符串的排列提取方式是百度网盘分享地址
java基础面试题左旋转字符串提取方式是百度网盘分享地址
在本篇文章中,我们将深入探讨5152单片机在Proteus...同时,掌握了string.h库中的常用函数可以帮助开发者更加高效地处理字符串相关的任务,提高编程效率。希望本文能为广大电子爱好者和工程师们提供一定的参考价值。
ZZ561401.CAB ZZ561401.CAB ZZ561401.CAB
JavaScript中的FizzBuzz 问题:编写一个以一个数字作为参数的方法。 对于三的倍数,返回“嘶嘶声”,对于五的倍数,返回“嗡嗡声”。 对于三和五的倍数的数字,返回“ FizzBuzz”,在所有其他情况下,返回...
文本文件直接按行读取为cellstr,MATLAB别的一些读取模式太zz了,这个函数直接读成字符串后面再处理了。输入参数可以是字符串标量或字符向量,应当是一个文件路径。不是的话会直接套成元胞输出 直接推荐readlines,...
在本篇文章中,我们将深入探讨如何使用5152单片机通过Proteus软件进行仿真,并利用P0端口来显示字符串常量的过程。这一技术对于初学者来说非常重要,因为它不仅涉及到硬件的设计与配置,还涉及到软件编程及调试等...
wincc SIMATIC WinCC是第一个使用最新的32位技术的过程监视系统,具有良好的开放性和灵活性。 从面市伊始,用户就对SIMATIC WinCC印象深刻。