ASP中用Join和Array,可以加快字符连接速度。

比如

1   
2Dim a(10000),i,t   
3t=Timer   
4For i=0 to 10000   
5a(i)=CStr(i)   
6Next   
7Response.Write Join(a,vbCrLf)   
8Response.Write timer-t   
9Erase a   

速度可以和php一拼(虽然还是没有他快)
另一种用法是

s=Join(Array("1","2","3",.....,"9999"))
速度依然比"1" & "2" & "3" & .....& "9999"要快很多

详细测试数据可以看:

////////////////////////////////////////////////////
//{测试用的客户端模版}
////////////////////////////////////////////////////

 1<html>
 2<head>
 3<title> New Document </title>
 4<meta content="EditPlus" name="Generator"/>
 5<meta content="" name="Author"/>
 6<meta content="" name="Keywords"/>
 7<meta content="" name="Description"/>
 8</head>
 9<body>
10<script language="VBScript">   
11dim t   
12t=timer   
13</script>
14<!--这儿放服务器测试脚本-->
15<script language="VBScript">   
16document.write "|" & (timer-t) '输出客户端完全接受到所有数据所用的时间   
17</script>
18</body>
19</html>

////////////////////////////////////////////////////
//{测试的各个脚本的代码}
////////////////////////////////////////////////////
//--------------------------------------------------
//test-js.asp
//使用数组收集所有的字符窜,最后通过join函数连接起来
//--------------------------------------------------

 1<script language="JavaScript" runat="Server">   
 2var i,t,s;   
 3var a=new Array(10000);   
 4t=(new Date()).getTime();   
 5for(i=0;i<10000;i++){   
 6//s+=String(i)+"\n";   
 7a[i]=String(i);   
 8}   
 9s=a.join("\n");   
10Response.Write(s);   
11Response.Write("<br>"+String((new Date()).getTime()-t));   
12a=null;   
13s=null;   
14</script>

//--------------------------------------------------
////////////////////////////////////////////////////
//--------------------------------------------------
//test-js2.asp
//--------------------------------------------------

 1<script language="JavaScript" runat="Server">   
 2var i,t,s="";   
 3t=(new Date()).getTime();   
 4for(i=0;i<10000;i++){   
 5s+=String(i)+"\n";   
 6}   
 7Response.Write(s);   
 8Response.Write((new Date()).getTime()-t);   
 9a=null;   
10s=null;   
11</script>

//--------------------------------------------------
////////////////////////////////////////////////////
//--------------------------------------------------
//test-js3.asp
//每得到一个数据,立刻输出到数据流中
//--------------------------------------------------

 1<script language="JavaScript" runat="Server">   
 2var i,t;   
 3t=(new Date()).getTime();   
 4for(i=0;i<10000;i++){   
 5Response.Write(i+"\n"); 
 6
 7}   
 8Response.Write("<br>");   
 9Response.Write((new Date()).getTime()-t);   
10</script>

//--------------------------------------------------
////////////////////////////////////////////////////
//--------------------------------------------------
//test-js3.asp
//这个程序通过建立零时文件,并将所有内容输入到文件中,最后统一输出
//建立零时文件所用的组件是FSO
//--------------------------------------------------

 1<script language="JavaScript" runat="Server">   
 2var i,t;   
 3t=(new Date()).getTime();   
 4var fso=Server.CreateObject("Scripting.FileSystemObject");//建立fso对象   
 5var f=fso.CreateTextFile(Server.MapPath("temp.txt"),true);//通过fso对象创建一个零时文件   
 6for(i=0;i<10000;i++){   
 7f.WriteLine(i);   
 8}   
 9f.Close();   
10f=fso.OpenTextFile(Server.MapPath("temp.txt"),1);   
11Response.Write(f.ReadAll());//读出零时文件的内容   
12f.Close();   
13f=null;   
14fso=null;   
15Response.Write("<br>");   
16Response.Write((new Date()).getTime()-t);   
17</script>

//--------------------------------------------------
////////////////////////////////////////////////////
//--------------------------------------------------
//test-js5.asp
//这个程序通过建立零时文件,并将所有内容输入到文件中,最后统一输出
//建立零时文件所用的组件是Adodb.Stream
//--------------------------------------------------

 1<script language="JavaScript" runat="Server">   
 2var i,t;   
 3t=(new Date()).getTime();   
 4var ado=Server.CreateObject("ADODB.Stream");   
 5ado.Mode=3;//设置为可读可写   
 6ado.Type=2;//设置内容为文本   
 7ado.Open();   
 8for(i=0;i<10000;i++){   
 9ado.WriteText(i+"\n");   
10}   
11ado.SaveToFile(Server.MapPath("temp.txt"),2);//保存一下,才可以读取   
12Response.Write(ado.ReadText(-1));   
13ado.Close();   
14ado=null;   
15Response.Write("<br>");   
16Response.Write((new Date()).getTime()-t);   
17</script>

//--------------------------------------------------
//test-vbs.asp
//这个程序使用数组收集所有的字符窜,最后通过join函数连接起来
//对应于test-js.asp
//--------------------------------------------------

1   
2dim i,a(9999),t   
3t=timer   
4For i=0 to 9999   
5a(i)=CStr(i)   
6Next   
7s=Join(a,vbCrLf)   
8Response.Write s   
9Response.Write "

<br/>

1" & CSTR(timer-t)   
2Erase a   
3s=""   

//--------------------------------------------------
//test-vbs2.asp
//使用一个零时的字符窜变量收集内容,最后输出
//对应于test-js2.asp
//--------------------------------------------------

1   
2dim i,j,s,t   
3t=timer   
4for i=0 to 9999   
5s=s & CStr(i) & vbCrLf   
6next   
7response.write s   
8s=""   
9response.write "

<br/>

1"&(timer-t)   

//--------------------------------------------------
////////////////////////////////////////////////////
//--------------------------------------------------
//test-vbs3.asp
//每得到一个数据,立刻输出到数据流中
//--------------------------------------------------

1   
2dim i,j,s,t   
3t=timer   
4for i=0 to 9999   
5response.write CStr(i) & vbCrLf   
6next   
7response.write "

<br/>

1"&(timer-t)   

//--------------------------------------------------
////////////////////////////////////////////////////
//--------------------------------------------------
//test-vbs4.asp
//这个程序通过建立零时文件,并将所有内容输入到文件中,最后统一输出
//建立零时文件所用的组件是FSO
//对应于test-js4.asp
//--------------------------------------------------

 1   
 2dim i,t,fso,f   
 3t=timer   
 4Set fso=Server.CreateObject("Scripting.FileSystemObject")   
 5Set f=fso.CreateTextFile(Server.MapPath("temp.txt"),true)   
 6for i=0 to 9999   
 7f.WriteLine CStr(i)   
 8next   
 9f.Close   
10Set f=fso.OpenTextFile(Server.MapPath("temp.txt"),1)   
11Response.Write f.ReadAll   
12f.Close   
13Set f=Nothing   
14Set fso=Nothing   
15response.write "

<br/>

1"&(timer-t)   

//--------------------------------------------------
////////////////////////////////////////////////////
//--------------------------------------------------
//test-vbs5.asp
//这个程序通过建立零时文件,并将所有内容输入到文件中,最后统一输出
//建立零时文件所用的组件是Adodb.Stream
//对应于test-js5.asp
//--------------------------------------------------

 1   
 2dim i,t,ado   
 3t=timer   
 4Set ado=Server.CreateObject("ADODB.Stream")   
 5ado.Mode=3'设置为可读可写   
 6ado.Type=2'设置内容为文本   
 7ado.Open   
 8for i=0 to 9999   
 9ado.WriteText CStr(i)&vbCrLf   
10next   
11ado.SaveToFile Server.MapPath("temp.txt"),2 '保存一下,才可以读取   
12Response.Write ado.ReadText()'读出全部内容,写入传送流   
13ado.Close   
14Set ado=Nothing   
15response.write "

<br/>

1"&(timer-t)   

{测试数据统一使用0到9999的一万个数据,每个数据后追加一个回车,通过各种途径输出到客户端屏幕,得出所需时间}
{以下是测试结果}
{测试结果的格式:服务器段测试结果|客户端测试结果}

  1<celeron 256mb="" 466mhz="" sdram="">   
  2[Windows98SE PWS 4.0]   
  3[InternetExplorer 6.0 Service Park 1]   
  4//test-js.asp(单位:毫秒|秒)   
  5//ASP using JavaScript and Array Join   
  6{JavaScript使用数组收集每一个测试数据,最后用join连接并输出,速度非常快}   
  7390 |.0546875   
  8440 |.0546875   
  9490 |0   
 10380 |0   
 11440 |.046875   
 12430 |.109375   
 13440 |0   
 14440 |.0625   
 15440 |.046875   
 16490 |.109375   
 17440 |.0546875   
 18////////////////////////////////////////////////////   
 19//test-js2.asp(单位:毫秒|秒)   
 20//ASP using JavaScript and Temperory Sting Join   
 21{JavaScript使用零时字符串收集每一个测试数据,最后并输出}   
 22{速度比较慢,页面出现前,都有短暂的等待,但是和VBscript快了很多}   
 234290 |0   
 243680 |.046875   
 254000 |0   
 263570 |.0625   
 273960 |.0546875   
 284070 |0   
 294290 |.0546875   
 304010 |.046875   
 313740 |0   
 324780 |0   
 334070 |.046875   
 344120 |.046875   
 35////////////////////////////////////////////////////   
 36//test-js3.asp(单位:毫秒|秒)   
 37//ASP using JavaScript and directly output   
 38{JavaScript每得到一个测试数据便立即输出}   
 39{速度比JS用零时字符串速度要慢,但比VBScript直接输出快一点}   
 40{但十分奇怪的是,客户端的运行时间几乎一直是0}   
 416700 |0   
 426750 |0   
 436920 |0   
 446650 |0   
 456650 |.046875   
 466650 |0   
 476920 |0   
 486970 |.0546875   
 496920 |0   
 507090 |0   
 51////////////////////////////////////////////////////   
 52//test-js4.asp(单位:毫秒|秒)   
 53//ASP using JavaScript and temperoy file with FSO   
 54{JavaScript使用FSO建立零时缓冲文件}   
 55{速度很快,但比数组连接慢}   
 56600 |.0625   
 57600 |0   
 58660 |0   
 59660 |.0625   
 60660 |0   
 61660 |.0546875   
 62660 |0   
 63720 |0   
 64660 |0   
 65660 |.0625   
 66////////////////////////////////////////////////////   
 67//test-js5.asp(单位:毫秒|秒)   
 68//ASP using JavaScript and temperoy file with ADODB.Stream   
 69{JavaScript使用ADODB.Stream建立零时缓冲文件}   
 70{速度很快,比JavaScript的其他方法都快,但比VBScript的数组连接要慢}   
 71380 |.0625   
 72330 |0   
 73390 |0   
 74380 |.0625   
 75390 |.0546875   
 76390 |0   
 77390 |.046875   
 78390 |.0546875   
 79380 |.0625   
 80390 |.046875   
 81////////////////////////////////////////////////////   
 82//test-vbs.asp(单位:秒|秒)   
 83//ASP using VBScript and Array Join   
 84{VBScript使用数组收集每一个测试数据,最后用join连接并输出}   
 85{速度是ASP测试中,速度最快的}   
 86.171875 |.3828125   
 87.1640625|.546875   
 88.1640625|.3828125   
 89.2265625|.328125   
 90.21875 |.390625   
 91.21875 |.375   
 92.171875 |.328125   
 93.2265625|.3828125   
 94.21875 |.3828125   
 95.21875 |.3359375   
 96.21875 |.328125   
 97////////////////////////////////////////////////////   
 98//test-vbs2.asp(单位:秒|秒)   
 99//ASP using VBScript and Temperory String Join   
100{VBScript使用零时字符串收集每一个测试数据,最后输出}   
101{速度是ASP测试中,速度最慢的,JavaScript中同样的方法也只有这个的一半都不到}   
102{其原因也许在于字符串连接和s=s&amp;"x"的不合理赋值方式}   
10310.71094 |10.75781   
10410.71094 |10.875   
1059.945313 |10.05469   
1069.773438 |9.882813   
10710.16406 |10.32031   
10810.21875 |10.32813   
10910.10156 |10.21094   
1109.671875 |9.78125   
1119.945313 |10.10938   
1129.9375 |10.10938   
1139.945313 |10.05469   
114////////////////////////////////////////////////////   
115//test-vbs3.asp(单位:秒|秒)   
116//ASP using VBScript and directly output   
117{VBScript每得到一个测试数据便立即输出}   
118{速度是ASP测试中,速度仅比VBScript的零时字符连接快,和JavaScript的同种方法得出的结果差不多,略慢}   
1197.46875 |7.421875   
1207.296875 |7.296875   
1217.03125 |7.03125   
1227.359375 |7.359375   
1237.3125 |7.3125   
1247.359375 |7.359375   
1257.1875 |7.1875   
1267.25 |7.25   
1277.304688 |7.304688   
1287.1875 |7.1875   
1297.640625 |7.640625   
130////////////////////////////////////////////////////   
131//test-vbs4.asp(单位:秒|秒)   
132//ASP using VBScript and temperoy file with FSO   
133{VBScript使用FSO建立零时缓冲文件}   
134{速度很快,但比JavaScript的同种方法略慢}   
135.828125 |1.046875   
136.765625 |.9296875   
137.828125 |1.039063   
138.71875 |.828125   
139.7109375|.875   
140.71875 |.828125   
141.71875 |.8828125   
142.71875 |.828125   
143.7734375|.8671875   
144.7734375|.8203125   
145////////////////////////////////////////////////////   
146//test-vbs5.asp(单位:秒|秒)   
147//ASP using VBScript and temperoy file with ADODB.Stream   
148{VBScript使用FSO建立零时缓冲文件}   
149{速度很快,和JavaScript的同种方法结果相近}   
150.390625 |.6015625   
151.59375 |.765625   
152.4921875|.6484375   
153.3828125|.546875   
154.3359375|.5546875   
155.328125 |.546875   
156.390625 |.5   
157.3359375|.4921875   
158.390625 |.5   
159.3359375|.5   
160////////////////////////////////////////////////////   
161//总结   
162////////////////////////////////////////////////////   
163{   
164测试结果很明显,数组连接及用ADODB.Stream建立缓冲文件在速度上占了上风   
165服务器端使用JavaScript会使客户端的反应加快?!!??   
166性能上VBScript在数组连接上性能很好   
167其他的不如JavaScript   
168但数组连接及用ADODB.Stream建立缓冲文件这两者各有缺陷   
169I 对于数组连接,用法比较复杂   
1701.数组连接在实际运用中,必须设置一个指针变量   
1712.使用上,由于数组的大小是在变化的   
172a.对于JavaScript,   
173必须用"var arrTemp=new Array();"来声明,这样可以不断扩大数组的尺寸   
174b.对于VBScript   
175必须用Dim arrTemp()来声明,并在程序用使用ReDim Preserve arrTemp(p+size)来扩大数组的尺寸,Preserve是用来保留数组中原有的内容   
176II对于ADODB.Stream建立缓冲文件的方法   
177我们必须设置一个零时文件,但每调用一次页面都要写这个文件,如果使用同一个零时文件,这就容易出现冲突   
178可以使用当前的时间来做零时文件名,以减少冲突,或者给文件作一个标示,如果文件没有过期,便直接读取,过期了,便打开写入新的内容   
179后者比较合适,前者容易造成零时文件的泛滥,垃圾成堆   
180但是后者实现也很复杂 
181
182此外,我没测试内存使用情况,不知道数组连接对内存使用会造成多大影响 
183
184}   
185////////////////////////////////////////////////////   
186//附1   
187////////////////////////////////////////////////////   
188{下面是用于对照的php脚本}   
189////////////////////////////////////////////////////   
190//--------------------------------------------------   
191//test.php   
192//使用字符连接   
193//对应于test-js2.asp和test-vbs2.asp   
194//--------------------------------------------------   
195<?   
196$t=gettimeofday();   
197for($i=0;$i<10000;$i++){   
198$s.=$i."\n";   
199}   
200echo($s."\n");   
201$now=gettimeofday();   
202echo(($now["sec"]-$t["sec"])*1000000+$now["usec"]-$t["usec"]);   
203?>   
204//--------------------------------------------------   
205////////////////////////////////////////////////////   
206//--------------------------------------------------   
207//test2.php   
208//直接输出   
209//对应于test-js3.asp和test-vbs3.asp   
210//--------------------------------------------------   
211<?   
212$t=gettimeofday();   
213for($i=0;$i<10000;$i++){   
214echo($i."\n");   
215}   
216$now=gettimeofday();   
217echo(($now["sec"]-$t["sec"])*1000000+$now["usec"]-$t["usec"]);   
218?>   
219//--------------------------------------------------   
220////////////////////////////////////////////////////   
221//--------------------------------------------------   
222//test3.php   
223//使用数组连接   
224//对应于test-js.asp和test-vbs.asp   
225//--------------------------------------------------   
226<?   
227$t=gettimeofday();   
228for($i=0;$i<10000;$i++){   
229$s[$i]=$i;   
230}   
231echo(implode("\n",$s));   
232$now=gettimeofday();   
233echo("<br>".(($now["sec"]-$t["sec"])*1000000+$now["usec"]-$t["usec"]));   
234?&gt;   
235//--------------------------------------------------   
236////////////////////////////////////////////////////   
237//--------------------------------------------------   
238//test4.php   
239//使用零时文件   
240//对应于test-js4.asp,test-js5.asp,test-vbs4.asp和test-vbs5.asp   
241//--------------------------------------------------   
242<?   
243$t=gettimeofday();   
244$fp=fopen("temp.txt","w");   
245for($i=0;$i<10000;$i++){   
246fwrite($fp,$i."\n");   
247}   
248fclose($fp);   
249//readfile("temp.txt");   
250include("temp.txt");   
251$now=gettimeofday();   
252echo("<br>".(($now["sec"]-$t["sec"])*1000000+$now["usec"]-$t["usec"]));   
253?&gt;   
254//--------------------------------------------------   
255////////////////////////////////////////////////////   
256<celeron 256mb="" 466mhz="" sdram="">   
257[Windows98SE Apache]   
258[InternetExplorer 6.0 Service Park 1]   
259//test.php(单位:微秒|秒)   
260//PHP Temperory String Join   
261{快}   
262188517|.109375   
263204281|.21875   
264174301|.171875   
265179169|.171875   
266185047|.1679688   
267198225|.1679688   
268200802|.1601563   
269217518|.2226563   
270199039|.171875   
271178899|.109375   
272////////////////////////////////////////////////////   
273//test2.php(单位:微秒|秒)   
274//PHP directly output   
275{也很快}   
276197242|.2226563   
277241610|.2695313   
278227355|.2734375   
279214959|.2226563   
280210478|.21875   
281230015|.2226563   
282222359|.1601563   
283215845|.21875   
284226364|.21875   
285210501|.21875   
286////////////////////////////////////////////////////   
287//test2.php(单位:微秒|秒)   
288//PHP using Array Join   
289{前面得很快便输出了,但到倒数几个(从9939开始)等待了很长时间}   
290{不知道是不是我的机子的问题,也许和apache服务器的程序设计有关}   
291358020|23.01172   
292340309|22.1875   
293397571|22.46875   
294365696|21.64063   
295495641|23.57031   
296464867|34.71094   
297530083|27.41406   
298493962|26.03125   
299351829|26.40625   
300430496|26.08594   
301////////////////////////////////////////////////////   
302//test4.php(单位:微秒|秒)   
303//PHP using Temperory file   
304{依然很快}   
305215117|.171875   
306220059|.171875   
307231748|.1640625   
308211022|.109375   
309232915|.1640625   
310196025|.1640625   
311210776|.21875   
312217552|.1640625   
313216197|.171875   
314259508|.171875   
315////////////////////////////////////////////////////   
316//总结   
317////////////////////////////////////////////////////   
318{   
319php的速度还是....   
320根本不用为速度而担忧,可以使用任何一种方式   
321asp我也没话好说的,总算数组连接方式还可以和php一拼,不过很奇怪,ASP with JavaScript 为什么在客户端的测试结果那么好?!   
322不清楚....   
323}   
324////////////////////////////////////////////////////   
325//附2:数组不断扩展的测试   
326////////////////////////////////////////////////////   
327//--------------------------------------------------   
328//test-js6.asp   
329//使用数组收集所有的字符窜,最后通过join函数连接起来   
330//--------------------------------------------------   
331<script language="JavaScript" runat="Server">   
332var i,t,s;   
333var a=new Array();   
334t=(new Date()).getTime();   
335for(i=0;i<10000;i++){   
336a[i]=String(i);   
337}   
338s=a.join("\n");   
339Response.Write(s);   
340Response.Write("<br>"+String((new Date()).getTime()-t));   
341a=null;   
342s=null;   
343</script>   
344//--------------------------------------------------   
345////////////////////////////////////////////////////   
346//--------------------------------------------------   
347//test-vbs6.asp   
348//使用数组收集所有的字符窜,最后通过join函数连接起来   
349//--------------------------------------------------   

dim i,a(),t
t=timer
For i=0 to 9999
ReDim Preserve a(i) '重定义大小
a(i)=CStr(i)
Next
Response.Write Join(a,vbCrLf)
Erase a
Response.Write "<br/>" &amp; CSTR(timer-t)

 1//--------------------------------------------------   
 2////////////////////////////////////////////////////   
 3//--------------------------------------------------   
 4<celeron 256mb="" 466mhz="" sdram="">   
 5[Windows98SE PWS 4.0]   
 6[InternetExplorer 6.0 Service Park 1]   
 7//test-js6.asp(单位:毫秒|秒)   
 8//ASP using JavaScript and Array Join   
 9{JavaScript使用数组收集每一个测试数据,最后用join连接并输出,但初始化时不直接给其指定大小}   
10{速度还是很快}   
11650 |0   
12440 |.046875   
13440 |.0625   
14440 |0   
15440 |.0546875   
16440 |.109375   
17490 |0   
18440 |.0546875   
19440 |0   
20////////////////////////////////////////////////////   
21//test-vbs6.asp(单位:毫秒|秒)   
22//ASP using VBScript and Array Join   
23{VBScript使用数组收集每一个测试数据,最后用join连接并输出,但初始化时不直接给其指定大小,程序中通过Redim Preserve重新定义}   
24{速度还是很快}   
25.328125 |.28125   
26.328125 |.5   
27.328125 |.5   
28.3828125|.3828125   
29.328125 |.4375   
30.328125 |.390625   
31.328125 |.4375   
32.3359375|.390625   
33.3359375|.4453125   
34.390625 |.390625   
35.3359375|.4921875   
36.390625 |.3828125   
37////////////////////////////////////////////////////   
38//总结   
39////////////////////////////////////////////////////   
40{   
41不断扩展数组,在JavaScript中对性能的影响并不是很大   
42在VBScript中确实有很大影响,但不影响它的成绩   
43所以,不必为不断扩展数组担心   
44}</celeron></celeron></celeron>
Published At
Categories with Web编程
Tagged with
comments powered by Disqus