当前位置:首页 --> 技术原创 --> 正文

四种连接字符串方法的比较

2008-7-24 10:49:00 来源: 浏览次数: 评论数: 字号:[ ]
        在日常开发中,连接字符串应该是一个很普遍的事情了。个人喜欢使用string.Format()方法来实现,因为它最为直观,阅读起来最为方便。但从来没有考虑过性能方面的因素。最近身体不适,连续休息快两个星期,时间都开始发霉了。总算下定决心将这个问题作个比较。
       
        除了最为普遍使用的string.Format()和直接拼接字符串外,这里还使用了StringBuilder的两个方法:AppendFormat()和Append()。下面是比较时使用的代码:
string str = null;
int max = 100000;
DateTime now = DateTime.Now;
for (int i = 0; i < max; i++)
{
    str = string.Format("A{0}", 12); 
}
TimeSpan ts = DateTime.Now - now;
Response.Write("String.Format:" + ts.Milliseconds.ToString() + "<br />");
now = DateTime.Now;
for (int i = 0; i < max; i++)
{
    str = "A"+ 12.ToString() ;
}
ts = DateTime.Now - now;
Response.Write("直接连接:" + ts.Milliseconds.ToString() + "<br />");

System.Text.StringBuilder builder = new System.Text.StringBuilder();
now = DateTime.Now;
for (int i = 0; i < max; i++)
{
    builder.AppendFormat("A{0}", 12);
}
ts = DateTime.Now - now;
Response.Write("StringBuilder.AppendFomrat:" + ts.Milliseconds.ToString() + "<br />");

builder = new System.Text.StringBuilder();
now = DateTime.Now;
for (int i = 0; i < max; i++)
{
    builder.Append("A").Append(12);
}
ts = DateTime.Now - now;
Response.Write("StringBuilder.Append:"+ts.Milliseconds.ToString() + "<br />");
        在这里,只是一个字符中和一个数字用拼接,次数为100000次,运行的结果是:
                String.Format:140
                直接连接:60
                StringBuilder.AppendFomrat:120
                StringBuilder.Append:70
 
这里的结果,每次刷新的都不一样,但是总的来说,由快到慢依次是:
      直接连接-->StringBuilder.Append-->StringBuilder.AppendFomrat-->String.Format。
StringBuilder.AppendFomrat、String.Format慢的原因应该是这里需要做替换。
 
        再将上面的拼接的字符串改为:A + 12 + B,结果为:
                String.Format:160
                直接连接:70
                StringBuilder.AppendFomrat:130
                StringBuilder.Append:80
 
        再将上面的拼接的字符串改为:A + 12 + B + 23,结果为:
                 String.Format:240
                直接连接:130
                StringBuilder.AppendFomrat:210
                StringBuilder.Append:150
 
        再将上面的拼接的字符串改为:A + 12 + B + 23 + C + 34,结果为:
                String.Format:330
                直接连接:230
                StringBuilder.AppendFomrat:300
                StringBuilder.Append:210
 
        在这里可以看到,当连接的次数上升后,直接连接需要的时间超过了StringBuilder.Append方法的时间。原因应该是,前者在不断的创建新的字符串并抛弃,而后者只是附加而已,没有新对象的产生。如果在StringBuilder连接字符串后加上这样的一句,builder.Length = 0;则后者的需要的时间更少,如,同是上面的连接串,测试的结果是:
                String.Format:320
                直接连接:240
                StringBuilder.AppendFomrat:270
                StringBuilder.Append:190
加上builder.Length = 0再测试的原意是,不希望多次申请内存,则发现,两者相差更大。
 
总结:
       1、不需要替换的方法的性能较优。
       2、不需要创建新对象的方法较其它的要好。
       3、当连接的次数为一个或两个时使用直接连接的方式最好。
       4、当进行复杂的连接时,使用StringBuilder.Append最好。
?
?