当前位置:编程学习 > 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
  这种方法有几个问题。首先,重复连接字符串所花费的时间,以二次方曲线的速率增长;粗略地计算,运行循环所花费的时间,与记录数乘以字段数的平方成正比。举一个简单的例子,便能清楚地说明这一点。
  s = ""
  For i = Asc("A") to Asc("Z")
   s = s & Chr(i)
  Next
  在第一次迭代中,得到一个字符的字符串“A”。在第二次迭代中,VBScript 必须重新分配字符串并复制两个字符“AB”到 s。在第三次迭代中,它必须再次重新分配 s,并复制三个字符到 s。在第 N 次(26 次)迭代中,它必须重新分配并复制 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 += "某字符串", 而不是 s = s + "某字符串"。

上一个:避免重新定义数组
下一个:在COM对象中封装代码

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