在日常开发中,连接字符串应该是一个很普遍的事情了。个人喜欢使用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最好。