1. 程式人生 > >關於Response.Write一個提高效能的技巧測試

關於Response.Write一個提高效能的技巧測試

今天在看MSDN的時候,看到裡面提供了一個技巧, MSDN原文如下:

      該方法提供非常有效的緩衝和連線服務。但是,如果您正在執行廣泛的連線,請使用多個 Response.Write 呼叫。下面示例中顯示的技術比用對 Response.Write 方法的單個呼叫連線字串更快。
   [C#]
   Response.Write("a");
   Response.Write(myString);
   Response.Write("b");
   Response.Write(myObj.ToString());
   Response.Write("c");
   Response.Write(myString2);
   Response.Write("d");

   [Visual Basic]
   Response.Write("a")
   Response.Write(myString)
   Response.Write("b")
   Response.Write(myObj.ToString())
   Response.Write("c")
   Response.Write(myString2)
   Response.Write("d")

       為了驗證一下正確性,我於是新建了一個WebForm,具體的測試程式碼如下:

       Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim startTime As Long
        Dim endTime As Long
        Dim intI As Integer

        Dim str1 = "Ilovethisgame"
        Dim str2 = "Ihatethisgame"

        startTime = DateTime.Now.Ticks

        For intI = 0 To 100000
            Response.Write("basketball" & str1 & "I can not say that" & str2)
        Next

        endTime = DateTime.Now.Ticks

        Response.Write("<br> Take Time(use only one Response.Write): " & (endTime - startTime) / 10000 & " (ms)")

        startTime = DateTime.Now.Ticks

        For intI = 0 To 100000
            Response.Write("basketball")
            Response.Write(str1)
            Response.Write("I can not say that")
            Response.Write(str2)
        Next

        endTime = DateTime.Now.Ticks

        Response.Write("<br> Take Time(use multi Response.Write): " & (endTime - startTime) / 10000 & " (ms)")
    End Sub

    這裡帖出來的是迴圈100000次的情況,我總共是測試了4個級別的,分別是迴圈100次,1000次,10000次, 100000次。(再到後面,我的機器就表現為CPU佔用100%,我什麼事情都幹不了了,^_^)

    具體的結果是:

       次數                                         用一個Response.Write輸出(ms)                 用多個Response.Write輸出(ms)

       100                                                             0                                                                             0

       1000                                                           0                                                                             0

       10000                                                     15.9145                                                                    0

       100000                                                   238.7175                                                               95.487

     我還在這些資料中去了同樣級別的其他資料進行測試,同樣的資料也測試了多次。雖然資料有波動。但是從總的資料來分析,確實使用多個Response.Write的話效能會高一些。

     想了一下,第一種方法之所以會效能差一些,可能是在字串進行連線的時候創造新的字串物件的時候佔去的時間。於是將測試程式碼改造了一下,如下:

    Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim startTime As Long
        Dim endTime As Long
        Dim intI As Integer

        Dim str1 = "Ilovethisgame"
        Dim str2 = "Ihatethisgame"
        Dim strTotal = ""

        startTime = DateTime.Now.Ticks

        For intI = 0 To 10000
            ' 這裡是更改的程式碼部分
            strTotal = strTotal & "basketball"
            strTotal = strTotal & str1
            strTotal = strTotal & "I can not say that"
            strTotal = strTotal & str2
            strTotal = ""
        Next

        endTime = DateTime.Now.Ticks

        Response.Write("<br> Take Time(use only one Response.Write): " & (endTime - startTime) / 10000 & " (ms)")

        startTime = DateTime.Now.Ticks

        For intI = 0 To 10000
            Response.Write("basketball")
            Response.Write(str1)
            Response.Write("I can not say that")
            Response.Write(str2)
        Next

        endTime = DateTime.Now.Ticks

        Response.Write("<br> Take Time(use multi Response.Write): " & (endTime - startTime) / 10000 & " (ms)")
    End Sub

    測試的記錄如下:

   次數                                      用一個Response.Write輸出(ms)            用多個Response.Write輸出(ms)

   100                                                                0                                                                      0

    1000                                                             0                                                                      0

    10000                                                     15.6642                                                               0

    100000                                                   156.642                                                          78.321      

    從上面的資料可以看出佔用時間數量級是一樣的     

     仔細想了一下,這回測試收穫是:

          1. 知道了一個提高輸出效能的方法。

          2. 耗時主要是由於不斷的new 出新的字串物件造成的。

       但是也有一些迷惑:

           1. 測試過程中,有時候發現測試的時間波動還是比較大的,雖然沒有數量級的變化。比如可能第一次測試得到的資料是156.642 ms,下次可能有220.780 ms等等。不知道是不是跟當時的CPU使用率有關。

           2. 如果上面的假設成立,那麼有沒有更好,更精確的測試方法和思路呢?

      那麼就請各位看官賜教了!謝謝 (還有對上面的測試思路有指正的也請不惜賜教)