關於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. 如果上面的假設成立,那麼有沒有更好,更精確的測試方法和思路呢?
那麼就請各位看官賜教了!謝謝 (還有對上面的測試思路有指正的也請不惜賜教)