当前位置:编程学习 > asp >>

在循环中避免进行字符串连接

答案:

很多人喜欢用如下的循环生成字符串: 


s = "<table>" & vbCrLf
For Each fld in rs.Fields
  s = s & " <th>" & fld.Name & "</th> "
Next

While Not rs.EOF
  s = s & vbCrLf & " <tr>"
  For Each fld in rs.Fields
    s = s & " <td>" & fld.value & "</td> "
  Next
  s = s & " </tr>"
  rs.MoveNext
Wend

s = s & vbCrLf & "</table>" & vbCrLf
Response.Write s

  这种方法有一些问题。第一个就是在循环中连接字符串会使时间成二次方(quadratic)成长;或者说,运行这个循环的时间同记录的字段数目平方成正比。

  下面简单的例子能更清楚地看见本质:

s = ""
For i = Asc("A") to Asc("Z")
  s = s & Chr(i)
Next

  在第一次循环中,s等于"A";在第二次循环中,VBScript必须重新分配s的空间,并把字符串"AB"赋给s;在第三次循环中,又重新分配s的空间,重新赋值。在第N(26)次循环中,VBScript重新分配并复制了N次字符串给s,所以,总共是1+2+3+...+N=N*(N+1)/2次复制。

  在上面例子中,如果有100条记录,每个记录有5个字段,则内循环执行100*5=500次,所有复制和重新分配空间的次数相应的就是 500*500=250,000次;这还只是对一个很小的记录集。

  在这中情况下,可以通过用Response.Write或是内嵌脚本(<% = fld.value %>)来替换字符串连接来提高性能。如果响应缓冲已经(也应该被)打开,Response.Write只是向响应缓冲尾部添加数据,没有重新分配内存,因此非常高效。

  在一些特定的将ADO记录集转换为HTML表的情况中,可以考虑使用GetRows或GetString函数。

  如果使用JScript连接字符串,强烈推荐使用 += 操作符;就是说,用 s += "some string",不要使用 s = s + "some string"。

 

 

上一个:避免使用服务器端变量
下一个:进程外执行以性能换取可靠性

CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,