最后我再补充一点,若是字节级别的字符串拼接就没有必要使用数组join了,毕竟开数组变量也是有消耗的。若组合的字符串在几K以上,那就该使用数组法了。
解决方案 »
- activx dll_web调用时不可以,不可能让用户拷到system32,再注册一下的吧
- 在js中使用document.getElementById取不到层对象
- 动态添加一行代码后,js找不到此行中的对象
- javascript 小数1.0 转换为 字符串"1.0"
- 关于JS控制css样式的问题
- 大家好,请教JS图片放大镜的细节
- 如何判断字符串中含有非法字符
- 請問window.history.go(-2)為什不起作用?
- 在上"--"下"|"三框架页面中,如果实现点击左侧框架链接,在右侧框架显示相应内容的同时刷新上面框架的内容!
- 如正文,求jQuery中,这种写法的相关资料和介绍
- 如何用javascript来判断文本框里输入的是否是汉字?
- 如何用 <- 和 -> 向前和向后翻页?
createElement最慢,innerHTML += 其次,
join最快
firefox1.5
字符串拼接法:拼接后的大字符串长 1010000字节,拼接耗时 1452毫秒!
数组赋值join法:拼接后的大字符串长 1010000字节,拼接耗时 1512毫秒!opera8.5
字符串拼接法:拼接后的大字符串长 1010000字节,拼接耗时 20毫秒!
数组赋值join法:拼接后的大字符串长 1010000字节,拼接耗时 30毫秒!IE6
字符串拼接法:拼接后的大字符串长 1010000字节,拼接耗时 33759毫秒!
数组赋值join法:拼接后的大字符串长 1010000字节,拼接耗时 50毫秒!
计算方法好象有错。抱歉,心烦,没心情看代码,只能帮忙简单地测试一下了。
firefox和opera下两者几乎一样的耗时,而IE下就是join快很多。
字符串拼接次数<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>
字符串拼接法:拼接后的大字符串长 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法优于传统字符串拼接。
里曾经推荐的一篇文章跟也符合本贴主题,
对于关注本贴的朋友,很值得一读。
其中的“Expand Your Options in a SELECT Element”也提到了本贴的观点:回复人: net_lover(孟子E章) ( ) 信誉:870 2005-9-16 15:13:27 得分: 0
http://msdn.microsoft.com/workshop/author/perf/dhtmlperf.asp
Faster DHTML in 12 Steps
字符串拼接次数<input id="totle" value="50000" size="5" maxlength="5">
<input type="button" value="字符串拼接法" onclick="method1()">
<input type="button" value="数组赋值join法" onclick="method2()">
<input type="button" value="数组直接join" onclick="method3()"><br>
<div id="method1"> </div>
<div id="method2"> </div>
<div id="method3"> </div>
<textarea id="show" style="width: 100%; height: 400"></textarea>
<SCRIPT LANGUAGE="JavaScript">
<!--
//这个被拼接的字符串长是100字节 author: meizz updated: emu
var str = "01234567891123456789212345678931234567894123456789";
str+= "51234567896123456789712345678981234567899123456789\n";//方法一
function method1()
{
var result = "";
var totle = parseInt(document.getElementById("totle").value);
if(totle>2000) {alert("次数太多了,做起来很慢的,还是算了吧");return;}
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;
}
//方法三
function method3()
{
var result = "";
var totle = parseInt(document.getElementById("totle").value);
var n = new Date().getTime(); var a = new Array(totle+1);
result = a.join(str); a=null;
document.getElementById("show").value = result; var s = "数组直接join法:拼接后的大字符串长 "+ result.length +"字节,"+
"拼接耗时 "+ (new Date().getTime()-n) +"毫秒!";
document.getElementById("method3").innerHTML = s;
}
//-->
</SCRIPT>
<body>
字符串拼接次数<input id="totle" value="500000" size="5" maxlength="5">
<input type="button" value="字符串拼接法" onclick="method1()">
<input type="button" value="数组赋值join法" onclick="method2()">
<input type="button" value="数组直接join" onclick="method3()"><br>
<div id="method1"> </div>
<div id="method2"> </div>
<div id="method3"> </div>
<textarea id="show" style="width: 100%; height: 400"></textarea>
<SCRIPT LANGUAGE="JavaScript">
<!--
//这个被拼接的字符串长是100字节 author: meizz updated: emu
var str = "0123456789";
//方法一
function method1()
{
var result = "";
var totle = parseInt(document.getElementById("totle").value);
if(totle>2000) {alert("次数太多了,做起来很慢的,还是算了吧");return;}
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;
}
//方法三
function method3()
{
var result = "";
var totle = parseInt(document.getElementById("totle").value);
var n = new Date().getTime(); var a = new Array(totle+1);
result = a.join(str); a=null;
document.getElementById("show").value = result; var s = "数组直接join法:拼接后的大字符串长 "+ result.length +"字节,"+
"拼接耗时 "+ (new Date().getTime()-n) +"毫秒!";
document.getElementById("method3").innerHTML = s;
}
//-->
</SCRIPT>
其实实际应用中不在乎这点细微的运行速度了,只是理论意义上的快。
很久没有回论坛来了,一回来就发现这里还有人在做这样的技术讨论,象以前一样……
<body>
字符串拼接次数<input id="totle" value="500000" size="8" maxlength="8">
<input type="button" value="字符串拼接法" onclick="method1()">
<input type="button" value="数组赋值join法" onclick="method2()">
<input type="button" value="数组直接join" onclick="method3()"><br>
<div id="method1"> </div>
<div id="method2"> </div>
<div id="method3"> </div>
<textarea id="show" style="width: 100%; height: 400"></textarea>
<SCRIPT LANGUAGE="JavaScript">
<!--
//这个被拼接的字符串长是100字节 author: meizz updated: emu
var str = "0123456789";
//方法一
function method1()
{
var result = "";
var totle = parseInt(document.getElementById("totle").value);
if(totle>10000) {alert("次数太多了,做起来很慢的,还是算了吧");return;}
var n = new Date().getTime(); for(var i=0; i<totle; i++)
result += str;
var s = "字符串拼接法:拼接后的大字符串长 "+ result.length +"字节,"+
"拼接耗时 "+ (new Date().getTime()-n) +"毫秒!";
document.getElementById("method1").innerHTML = s;
document.getElementById("show").value = result;
}//方法二
function method2()
{
var result = "";
var totle = parseInt(document.getElementById("totle").value);
var n = new Date().getTime(); var a = new Array(totle);
for(var i=0; i<totle; i++)
a[i] = str;
result = a.join(""); var s = "数组赋值join法:拼接后的大字符串长 "+ result.length +"字节,"+
"拼接耗时 "+ (new Date().getTime()-n) +"毫秒!";
document.getElementById("method2").innerHTML = s;
document.getElementById("show").value = result;a=null;
}
//方法三
function method3()
{
var result = "";
var totle = parseInt(document.getElementById("totle").value);
var n = new Date().getTime(); var a = new Array(totle+1);
result = a.join(str); var s = "数组直接join法:拼接后的大字符串长 "+ result.length +"字节,"+
"拼接耗时 "+ (new Date().getTime()-n) +"毫秒!";
document.getElementById("method3").innerHTML = s;
document.getElementById("show").value = result; a=null;
}
//-->
</SCRIPT>
不过在实际应用中多数需要通过循环来得到变量再进行组合,所以这种方法只能用于组合内容相同的拼接。鱼和熊掌啊!
对于此类问题,我以前的办法是:
先分组拼接,再分组,一级级下去,最后一级只有两三个长字符串接在一起。例如:
a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16 a17
b0 b1 b2 b3 b4 b5
c0 c1
d0对于最终字符串长度为600K的大字符串来说,速度提高几十倍到上百倍
Dim sString
sString="01234567891123456789212345678931234567894123456789"
sString = sString & "abcdefghijklmnopqrstuvwxyz"用join来处理字符串时也比sString = sString & 快吗?那两种方法在内存占用上是sString = sString & 和用数组 join来处理那个有优势(占用少)
join是针对数组的方法,如果只是简短的字符串组合,就象你写的那样,就没必要用数组再join了。
比如一个文章列表有40行,
在ASP中现在的写法都是得到数据然后用FOR来连接(sString = sString &)要
输出的列表HTML字符串.
最后把这个字符串变量输出到网页中
Private Sub Command1_Click()
Dim st As Date
st = Now
Dim str As String
For i = 0 To 50000
str = str + "test"
Next
Dim et As Date
et = Now
MsgBox (et - st)
End SubPrivate Sub Command2_Click()
Dim st As Date
st = Now
Dim strarr(50000) As Variant
For i = 0 To 50000
strarr(i) = "test"
Next
Dim str As String
str = Join(strarr, "")
Dim et As Date
et = Now
MsgBox (et - st)
End Sub
function StringBuilder(sString){//字符串连接操作类
this.length=0;
this.append=function(sString){
this.length+=(this._parts[this._current++]=String(sString)).length;
this._string=null;
return this;
};
this.toString=function(){
if(this._string!=null)
return this._string;
var s=this._parts.join("");
this._parts=[s];
this._current=1;
return this._string=s;
};
this._current=0;
this._parts=[];
this._string=null;
if(sString!=null)
this.append(sString);
};
/*
new StringBuilder([string])// 实例化字符连接对象,其中string为可选初始字符
stringObj.append(string);//连接字符操作方法,string为必选参数
stringObj.toString();//转换输出字符串对象
*/
var str=new StringBuilder();
str.append("a");
str.append("b");
alert(str.toString());
</script>
以前在51js看到的字符串连接类
js的引擎设计决定它在大量对象工作效率低下,
但是能够消除循环引用。
js的string类可能参考了java的string类,
被作成是不能够动态改变大小的
(所谓改变实际上是重建一个对象)
仅是猜测,没有试过,
今天比较糟糕,不试了,下先。