<form id="hz9zz"></form>
  • <form id="hz9zz"></form>

      <nobr id="hz9zz"></nobr>

      <form id="hz9zz"></form>

    1. 明輝手游網中心:是一個免費提供流行視頻軟件教程、在線學習分享的學習平臺!

      提高ASP性能的最佳選擇(續3)

      [摘要]引用記錄集中域值的最有效方法是什么?   到目前為止,我都是用名字引用記錄集中的域值的。這可能是一種效率很低的方法,因為每次調用都需要查找域。為了證明這一點,下面的測試就要通過記錄集中域的集合的指針來引用域(ADO__08.asp):   'write data   Do While No...
      引用記錄集中域值的最有效方法是什么?
        到目前為止,我都是用名字引用記錄集中的域值的。這可能是一種效率很低的方法,因為每次調用都需要查找域。為了證明這一點,下面的測試就要通過記錄集中域的集合的指針來引用域(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


        正如我們所預料的,裝載時間的變化很。ú町惪赡苁怯捎诖a上的輕微減少引起的)。但是這種技術在有效顯示時間上卻帶來了明顯的減少。

        在下面的例子中,我們將給每個域指定一個單獨的變量。這種方法避免了在表格循環內的所有查找( 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


        到目前,這種方法形成的結果是最好的。每條記錄的顯示時間下降成了.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之后,立刻就將記錄集設置為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 指令。這個方法將整個記錄集提取到一個大的字符串中,允許你指定自己的分隔符( 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


        雖然這種方法已經接近了最高水平,但是它只適合于最簡單的設計,因為它根本就不能應用于數據的特殊情況。

      觀察
        在我們開始這套測試之前,執行每條記錄的時間一直在.83 毫秒左右震動。這套測試中的大多數方法都將這個數字減少了一半。雖然有些方法明顯地提供了更快的速度,但是代價是靈活性的降低。

        下面的規則是以重要程度為順序的:

      * 當記錄集中的值不需要用一種特殊方式來對待并且能夠格式化為一種統一的格式時,使用GetString方法來提取數據。
      * 當你在設計上需要更大的靈活性,但是又不需要用記錄集的元數據進行工作,使用GetRows 方法將數據提取到一個數組中。
      * 當你需要設計的靈活性和元數據時,在進入一個數據恢復的循環之前,將你的域約束在本地變量中。避免用名字引用域。
      使用臨時字符串可以較好地代替緩沖器嗎?
        這是針對我上一篇文章提交的一些注解所引發的一個小小的離題。要討論的問題是圍繞著緩沖器的使用及使用臨時字符串作為替代來收集輸出,這樣就允許Response.Write 只調用一次。為了測試,我從ADO_11.asp的代碼開始,將結果附加到一個字符串中,而不是在每個循環都調用Response.Write,當整個操作都結束后,在字符串上調用Response.Write ( STR__01.asp ):

        Dim strTable

        strTable = ""

        'write headings

        strTable = strTable & "< TABLE BORDER=1 >< TR >"

        For i = 0 to fldCount-1

        strTable = strTable & "< TH >" & fld(i).name & "< /TH >"

        Next

        strTable = strTable & "< /TR >"

        'write data

        Do While Not objRS.EOF

        strTable = strTable & "< TR >"

        For i = 0 to fldCount-1

        strTable = strTable & "< TD >" & fld(i) & "< /TD >"

        Next

        strTable = strTable & "< /TR >"

        objRS.MoveNext

        Loop

        For i = 0 to fldCount-1

        Set fld(i) = Nothing

        Next

        strTable = strTable & "< /TABLE >"

        Response.Write(strTable)


        看起來執行得不是很好。也許正象許多人建議的,我們應該用Space 指令為這個字符串指定一些空間,這樣它就不需要在循環期間總是為自己重新分配空間( STR__02.asp ):

        Dim strTable

        strTable = Space(10000)


        也許Space 指令并不象建議的那樣工作。我們最后的規則是:不要用臨時字符串來收集輸出。





      日韩精品一区二区三区高清