欢迎光临
我们一直在努力

ASP程序性能测试报告(七)

建站超值云服务器,限时71元/月

十、用哪种方法引用记录集字段值效率最高?

   10.1 测试

   至此为止我们一直通过名字引用记录集中的字段值。由于这种方法要求每次都必须寻找相应的字段,它的效率并不高。为证明这一点,下面这个测试中我们通过字段在集合中的索引引用它的值(ado__08.asp):

  write data
   do while not objrs.eof
      response.write( _
         "< tr >" & _
         "< td >" & objrs(0) & "< /td >" & _
         "< td >" & objrs(1) & "< /td >" & _
         "< td >" & objrs(2) & "< /td >" & _
         "< td >" & objrs(3) & "< /td >" & _
         "< td >" & objrs(4) & "< /td >" & _
         "< td >" & objrs(5) & "< /td >" & _
         "< td >" & objrs(6) & "< /td >" & _
         "< /tr > " _
      )
      objrs.movenext
   loop

   和预期的一样,页面开销也有小小的变化(这或许是因为代码略有减少)。然而,这种方法在显示时间上的改善是相当明显的。

   在下一个测试中,我们把所有的字段分别绑定到变量(ado__09.asp):

if objrs.eof then
   response.write("no records found")
else
   write headings
   …
   dim fld0
   dim fld1
   dim fld2
   dim fld3
   dim fld4
   dim fld5
   dim fld6
   
   set fld0 = objrs(0)
   set fld1 = objrs(1)
   set fld2 = objrs(2)
   set fld3 = objrs(3)
   set fld4 = objrs(4)
   set fld5 = objrs(5)
   set fld6 = objrs(6)
   
   write data
   do while not objrs.eof
      response.write( _
         "< tr >" & _
         "< td >" & fld0 & "< /td >" & _
         "< td >" & fld1 & "< /td >" & _
         "< td >" & fld2 & "< /td >" & _
         "< td >" & fld3 & "< /td >" & _
         "< td >" & fld4 & "< /td >" & _
         "< td >" & fld5 & "< /td >" & _
         "< td >" & fld6 & "< /td >" & _
         "< /tr >" _
      )
      objrs.movenext
   loop
   
   set fld0 = nothing
   set fld1 = nothing
   set fld2 = nothing
   set fld3 = nothing
   set fld4 = nothing
   set fld5 = nothing
   set fld6 = nothing
   
   response.write("< /table >")
end if

   这是目前为止最好的记录。请注意单个记录的显示时间已经降低到0.45毫秒以下。

   上述脚本都要求对结果记录集的构造有所了解。例如,我们在列标题中直接使用了字段名字,单独地引用各个字段值。下面这个测试中,不仅字段数据通过遍历字段集合得到,而且字段标题也用同样的方式得到,这是一种更为动态的方案(ado__10.asp)。

if objrs.eof then
   response.write("no records found")
else
   write headings   
   response.write("< table border=1 >< tr >")
   for each objfld in objrs.fields
      response.write("< th >" & objfld.name & "< /th >")
   next
   response.write("< /tr >")
   
   write data
   do while not objrs.eof
      response.write("< tr >")
      for each objfld in objrs.fields
         response.write("< td >" & objfld.value & "< /td >")
      next
      response.write("< /tr >")
      objrs.movenext
   loop
   response.write("< /table >")
end if

   可以看到,代码性能有所下降,但它仍旧要比ado__07.asp要快。

   下一个测试示例是前面两个方法的折衷。我们将继续保持动态特征,同时通过在动态分配的数组中保存字段引用提高性能:

if objrs.eof then
   response.write("no records found")
else
   dim fldcount
   fldcount = objrs.fields.count
   dim fld()
   redim fld(fldcount)
   dim i
   for i = 0 to fldcount-1
      set fld(i) = objrs(i)
   next

   write headings
   response.write("< table border=1 >< tr >")   
   for i = 0 to fldcount-1
      response.write("< th >" & fld(i).name & "< /th >")
   next
   response.write("< /tr >")
      
   write data
   do while not objrs.eof
      response.write("< tr >")
      for i = 0 to fldcount-1
         response.write("< td >" & fld(i) & "< /td >")
      next
      response.write("< /tr >")
      objrs.movenext
   loop
   
   for i = 0 to fldcount-1
      set fld(i) = nothing
   next
   response.write("< /table >")
end if

   虽然还不能超过以前最好的成绩,但它比开头的几个示例要快,同时它具有动态地处理任何记录集这一优点。

   与前面的测试代码相比,下面的测试代码有了根本性的改动。它使用记录集对象的getrows方法填充数组以供循环访问数据,而不是直接访问记录集本身。注意在调用getrows之后立即把recordset设置成了nothing,也就是尽快地释放了系统资源。另外,请注意数组的第一维代表字段,第二维代表行(ado__12.asp)。

if objrs.eof then
   response.write("no records found")
   objrs.close
   set objrs = nothing
else
   write headings
   …

   set array
   dim arrrs
   arrrs = objrs.getrows
   
   close recordset early
   objrs.close
   set objrs = nothing

   write data
   dim numrows
   dim numflds
   dim row
   dim fld
   numflds = ubound(arrrs, 1)
   numrows = ubound(arrrs, 2)
   for row= 0 to numrows
      response.write("< tr >")
      for fld = 0 to numflds
         response.write("< td >" & arrrs(fld, row) & "< /td >")
      next
      response.write("< /tr >")
   next

   response.write("< /table >")
end if

   使用getrows方法时,整个记录集都被提取到了数组。虽然记录集极端庞大时可能产生资源问题,但是用循环访问数据的速度确实更快了,这是由于取消了movenext和检查eof之类的函数调用。

   速度是要付出代价的,现在记录集的元数据已经丢失了。为解决这个问题,我们可以在调用getrows之前从记录集对象提取标题信息;此外,数据类型和其他信息也可以预先提取。另外还要注意的是,测试中性能上的优势只有在记录集较大的时候才会出现。

   这一组的最后一个测试中,我们使用了记录集的getstring方法。getstring方法将整个记录集提取成为一个大的字符串,并允许指定分隔符(ado__13.asp):

if objrs.eof then
   response.write("no records found")
   objrs.close
   set objrs = nothing
else
   write headings
   …
   
   set array
   dim strtable
   strtable = objrs.getstring (2, , "</td><td>", "</td></tr><tr><td>")
   
   close recordset early
   objrs.close
   set objrs = nothing
   
   response.write(strtable & "</td></tr></table>")
end if

   虽然这种方法在速度上的好处非常明显,但它只适用于最简单的操作,根本无法适应稍微复杂的数据操作要求。

赞(0)
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com 特别注意:本站所有转载文章言论不代表本站观点! 本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。未经允许不得转载:IDC资讯中心 » ASP程序性能测试报告(七)
分享到: 更多 (0)

相关推荐

  • 暂无文章