答案:很多人喜欢用如下的循环生成字符串:
s = "<table>" & vbCrLf
For Each fld in rs.Fields
s = s & " <th>" & fld.Name & "</th> "
NextWhile 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
Wends = 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"。
上一个:避免使用服务器端变量
下一个:进程外执行以性能换取可靠性