今天在看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. 如果上面的假设成立,那么有没有更好,更精确的测试方法和思路呢?
那么就请各位看官赐教了!谢谢 (还有对上面的测试思路有指正的也请不惜赐教)