C#字符串拼接 "+"连接与Append()方法 速度比较

作者在 2009-10-25 10:50:04 发布以下内容

C#字符串拼接 "+"连接与Append()方法 速度比较

闲来无事,为了验证一下 "+"与append()方法拼接字符串速度比较,append方法更快,究竟快多少,在什么样的数量级别用"+"连接,在什么样的级别要改用append()方法连接字符串,写了一段代码,一测试,结果有点出乎意外。

拼交接例子就是连接字符串1,结果发现在拼接10 000个1,两者速度不相上下,但到了100 000个级别,“+”连接就显得很无力了,居然要了将近40s,很明显,时间与数量并非线性递增关系,然页append()方法依然超快,几乎不要时间 (62毫秒)。再测试,在40 000级别,“+”连接需时就达1秒左右,append()在10 000 000(千万级),也只要了750毫秒,只是在页面输出时没有能显示完,挂机了。“+”百万级没敢做了,估计当机。

 

大量字符串拼接时,append()方法明显优于"+"连接。

 

测试环境: T5600 2G  DDR2   IE8  VS2008  (同时45个进程)

 

前台:    “+”连接  ADD测试       append ()  方法  APP测试

  1. <%@ Page Language="C#" AutoEventWireup="true" CodeFile="conbineStringTest.aspx.cs" Inherits="test_conbineStringTest" %>

  2. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

  3. <html xmlns="http://www.w3.org/1999/xhtml">
  4. <head runat="server">
  5.     <title></title>
  6. </head>
  7. <body>
  8.     <form id="form1" runat="server">
  9.     <div>
  10.       请输入长度  <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
  11.         <asp:Button ID="Button2" runat="server" Text="ADD测试" 
  12.             onclick="Button2_Click" />
  13.         <asp:Button ID="Button3" runat="server" Text="APP测试" 
  14.             onclick="Button3_Click" /><br/>
  15.             <span id="add" runat="server"></span><br/>
  16.             <span id="app" runat="server"></span>

  17.     </div>
  18.     </form>
  19. </body>
  20. </html>

后台:

 

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Web;
  5. using System.Web.UI;
  6. using System.Web.UI.WebControls;
  7. using System.Text;

  8. public partial class test_conbineStringTest : System.Web.UI.Page
  9. {
  10.     protected void Page_Load(object sender, EventArgs e)
  11.     {

  12.     }

  13.     protected void Button2_Click(object sender, EventArgs e)
  14.     {
  15.         clear();
  16.         int i = 0;
  17.         if (System.Text.RegularExpressions.Regex.IsMatch(this.TextBox1.Text, @"\d+"))
  18.         {
  19.             int count = Convert.ToInt32(this.TextBox1.Text);
  20.             DateTime startTime = DateTime.Now;
  21.             string r = null;
  22.             for (i = 1; i <= count; i++)
  23.             {
  24.                 r += "1";
  25.                 if (i % 100 == 0)
  26.                 {
  27.                     r += "<br/>";
  28.                 }
  29.             }
  30.             DateTime endTime = DateTime.Now;
  31.             this.add.InnerHtml = "ADD开始于:" + startTime.ToString("yyyy-MM-dd HH:mm:ss.fff") + "  结束于:" + endTime.ToString("yyyy-MM-dd HH:mm:ss.fff") + "用时:" + DateDiff(endTime, startTime) + "<br/>" + r;
  32.         }
  33.         else
  34.         {
  35.             this.add.InnerHtml = "请输入一个数字";
  36.         }
  37.     }

  38.      private string DateDiff(DateTime DateTime1, DateTime DateTime2) 
  39.         { 
  40.             string dateDiff = null
  41.              
  42.             TimeSpan ts1 = new TimeSpan(DateTime1.Ticks); 
  43.             TimeSpan ts2 = new TimeSpan(DateTime2.Ticks); 
  44.             TimeSpan ts = ts1.Subtract(ts2).Duration();
  45.             //dateDiff = ts.Days.ToString() + "天"
  46.             //    + ts.Hours.ToString() + "小时"
  47.             dateDiff = ts.Minutes.ToString() + "分钟"
  48.               + ts.Seconds.ToString() + "秒"
  49.               + ts.Milliseconds.ToString() + "毫秒";
  50.               return dateDiff;
  51.         }
  52.      protected void Button3_Click(object sender, EventArgs e)
  53.      {
  54.          clear();
  55.          int i = 0;
  56.          int count = Convert.ToInt32(this.TextBox1.Text);
  57.          DateTime startTime = DateTime.Now;
  58.          StringBuilder sb = new StringBuilder();
  59.          for (i = 1; i <= count; i++)
  60.          {
  61.              sb.Append("1");
  62.              if (i % 100 == 0)
  63.              {
  64.                  sb.Append("<br>");
  65.              }
  66.          }
  67.          DateTime endTime = DateTime.Now;
  68.          this.app.InnerHtml = "APP开始于:" + startTime.ToString("yyyy-MM-dd HH:mm:ss.fff") + "  结束于:" + endTime.ToString("yyyy-MM-dd HH:mm:ss.fff") + "用时:" + DateDiff(endTime, startTime) + "<br/>" + sb.ToString(); 
  69.      }

  70.      protected void clear()
  71.      {
  72.          this.app.InnerHtml = null;
  73.          this.add.InnerHtml = null;
  74.      }
  75. }
技术 | 阅读 2879 次
文章评论,共1条
源本英明C
2010-06-17 13:52
1
zhege wo xihuan
游客请输入验证码
浏览1940833次