|
![]() |
名片设计 CorelDRAW Illustrator AuotoCAD Painter 其他软件 Photoshop Fireworks Flash |
|
十、用哪种方式引用记录集字段值效率最高? 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 虽然这种方式在速度上的好处异常明显,但它只适用于最简朴的操作,根本无法适应轻微复杂的数据操作要求。 返回类别: 教程 上一教程: 在ASP应用中如何限制同一表单被多次提交 下一教程: 把文件存进ACCESS数据库然后取出来供人下载的代码 您可以阅读与"ASP程序性能测试报告(七)"相关的教程: · ASP程序性能测试报告(五) · ASP程序性能测试报告(六) · asp性能测试报告(转)(一) · asp性能测试报告(转)(六) · asp性能测试报告(转)(七) |
![]() ![]() |
快精灵印艺坊 版权所有 |
首页![]() ![]() ![]() ![]() ![]() ![]() ![]() |