今天看了javascript高级程序设计,其中注意到字符串连接性能问题的谈论.感觉以前自己写的程序只讲简单但是没有注意到性能问题.其中,在javascript中用的最多的字符串连接就有最大的问题.
例如:
var str = "hello";
str += "world";
大家可能使用最普遍的就是这种了,实际上,这段代码在幕后执行的步骤如下:
1, 创建存储"hello"的字符串.
2. 创建存储"world"的字符串.
3.创建存储连接结果的字符串.
4. 把str的当前内容复制到结果中.
5.把"world"复制的结果中.
6.更新str,使它指向结果.
大家不难看出:每次完成字符串连接都会执行步骤2到6,使得这种操作非常消耗资源.如果重复这一过程几百次,甚至几千次,就会造成性能问题.所以,以后一定要注意,别做毫无意义的消耗...
既然有问题,那就要解决.解决方法就是用Array对象存储字符串,然后用join()方法(参数是空字符串)创建最后的字符串.
例如:
var arr = new Array;
arr[0] = "hello";
arr[1] = "world";
var str = arr.join("");
这样,无论在数组中引入多少字符串都不成问题,因为只在调用join()方法时才会发生连接操作.执行的步骤:
1. 创建存储结果的字符串.
2. 把每个字符串复制到结果中的合适位置.
当然,我们可以使它更容易理解一些,可以用StringBuffer类打包该功能:
- function StringBuffer() {
-
this.__strings__ = new Array;
- }
-
- StringBuffer.prototype.append = function (str) {
-
this.__strings__.push(str);
- }
-
- StringBuffer.prototype.toString = function() {
-
return this.__strings__.join("");
- }
-
上述代码很容易理解,就不用多说,下面着重看一下,两种方法的性能比较.(用事实说话哟)^_^
下面代码测试StringBuffer对象和传统的字符串连接方法的性能比较:
- 传统方法:
-
-
var d1 = new Date();
-
-
var str = "";
-
- for (var i=0; i < 10000; i++) {
-
str += "text";
- }
-
-
var d2 = new Date();
-
-
- StringBuffer对象实现:
-
-
var oBuffer = new StringBuffer();
-
-
d1 = new Date();
-
- for (var i=0; i < 10000; i++){
-
oBuffer.append("text");
- }
-
- var sResult = oBuffer.toString();
-
-
d2 = new Date();
-
-
document.write("<br/>concatenation with StringBuffer: " +
-
(d2.getTime() - d1.getTime()) + " milliseconds" );
-
经过上述测试结果应该说明使用StringBuffer类比使用加号可节省50%-66%的时间.(计算程序执行的时间差,
是衡量javascript性能最常用的方法).
好了,大家可能对字符串连接有一种新的认识,其实,我们也可以看到使用对象编程的一个好处..^_^.
有什么理解有误或写法不准确的地方,希望高手留言或评论指正.
<javascript 高级程序设计=""></javascript>
以上是转载的,但是实际用例测试之后,并不是这样子的。
自己做了三个测试:
function addStr(){
var ts = new Date();
var str = "";
for(var i=0;i<10000;i++)
{
str += "text"
}
var te = new Date();
document.write("原始的方法加号 拼接10000个字符串 花费时间:"+(te.getTime()-ts.getTime())+"秒");
}
function stringbufferStr(){
var oSB = new StringBuffer();
var sbts = new Date();
for(var i=0;i<10000;i++)
{
oSB.append("text");
}
var sRst = oSB.toString();
var sbte = new Date();
document.write("<br/>StringBuffer 拼接10000个字符串 花费时间:"+(sbte.getTime()-sbts.getTime())+"秒");
}
function arryAddStr(){
var ayts = new Date();
var ayy=[];
var str = "";
for(var i=0;i<10000;i++)
{
ayy.push("text");
}
str = ayy.join(";");
var ayte = new Date();
document.write("<br/>ayy数组 push 拼接10000个字符串 花费时间:"+
(ayte.getTime()-ayts.getTime())+"秒");
}
addStr();
stringbufferStr();
arryAddStr();
chrome下的结果:
原始的方法加号 拼接10000个字符串 花费时间:1秒
StringBuffer 拼接10000个字符串 花费时间:6秒
ayy数组 push 拼接10000个字符串 花费时间:1秒
IE8下的结果:不稳定
原始的方法加号 拼接10000个字符串 花费时间:0秒
StringBuffer 拼接10000个字符串 花费时间:16秒
ayy数组 push
拼接10000个字符串 花费时间:0秒
360下的结果:
原始的方法加号 拼接10000个字符串 花费时间:0秒
StringBuffer 拼接10000个字符串 花费时间:16秒
ayy数组 push
拼接10000个字符串 花费时间:15秒
oP浏览器下的结果:
原始的方法加号 拼接10000个字符串 花费时间:1秒
StringBuffer 拼接10000个字符串 花费时间:2秒
ayy数组 push 拼接10000个字符串 花费时间:1秒
FF下的结果:
原始的方法加号 拼接10000个字符串 花费时间:0秒
StringBuffer 拼接10000个字符串 花费时间:1秒
ayy数组 push 拼接10000个字符串 花费时间:1秒
如果把数量增加到十万,还是+最快啊
分享到:
相关推荐
JavaScript语言教程:JavaScript 字符串
JavaScript字符串函数大全 JS自带函数 JavaScript字符串函数大全 JS自带函数
javascript字符串操作,有对其中字符串的各种操作方法
头歌教学实践平台 Web前端开发基础 JavaScript学习手册九:字符串。源码txt格式。
JS自带函数,concat,indexOf,将整个字符串转成小写字母,通过将字符串划分成子串,将一个字符串做成一个字符串数组。
资源名称:javascript字符串函数 中文WORD版 内容简介: 本文档主要讲述的是javascript字符串函数;希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看 资源截图: ...
javascript 常用字符串函数
1.2 使用数组 在常用的语言中,字符串连接运算的性能普遍不高,为此在C#中就专门提供了StringBuilder(Java中提供了StringBuffer)用于连接字符串。而在Javascript中就出现了通过Array模拟StringBuilder的方案。 ...
theredoc - 让多行JavaScript字符串看起来排版更好
本文实例讲述了javascript实现的字符串与十六进制表示字符串相互转换方法。分享给大家供大家参考。具体如下: 之所以写这个,是因为发现SQL注入和XSS中经常利用十六进制表示的字符串,比如 SELECT CONCAT(0x68656c6...
今天看了javascript 高级程序设计谈到了字符串连接的性能问题
字符串都是由若干字符组成的,这些字符的数量就是字符串的长度,通过字符串的长度可以获取整个字符串的长度。 2.4.3 字符串型 4、字符串拼接 多个字符串之间可以使用+进行拼接,其拼接方式为字符串+任何类型=拼接...
js字符串的处理函数、带实例 、
本文主要针对Javascript中字符串相关常用的使用方法进行了总结
这是一个JAVASCRIPT的字符串排序方法,比默认的SORT方法效率要高,速度快。
javascript 字符串去掉左右空格, 用正则实现, trim()功能, 简单易用.
字符串生成器javascript StringBuilder 将选择一种快速的方式来运行字符串连接。 单元测试 var sb = new StringBuilder ( ) ; sb . append ( "a" ) . append ( "b" ) ; sb . appends ( "a" , "b" ) ; console . log ...
每种程序语言中都会涉及到字符窜连接,而这个小小的字符窜连接问题很可能会影响到系统的整体性能,本文主要探讨JavaScript中字符串连接的性能问题