关于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. 如果上面的假设成立,那么有没有更好,更精确的测试方法和思路呢?

      

      那么就请各位看官赐教了!谢谢 (还有对上面的测试思路有指正的也请不惜赐教)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值