关于String (译)
对String
有一定了解的话,你一定会尽量避免写出下面的代码。
static string Shlemiel()
{
string result = "";
for (int i = 0; i < 314159; i++)
{
result += getStringData(i);
}
return result;
}
因为,String在大多数有垃圾回收机制的语言里具有“恒定性“即:
对两个字符串进行“+”操作,会创建两个内容相同的字符串副本。那么,循环里进行“+”操作,会占用大量内存。
现在我们要创建如下的html代码段:
<div class="user-action-time">stuff</div>
<div class="user-gravatar32">stuff</div>
<div class="user-details">stuff<br/>stuff</div>
假设,这段代码被用到一个网页里,而这个页面没天会被调用千万次,假设。。
那么用下面哪种方式会更快一些?
1: Simple Concatenation
string s =
@"<div class=""user-action-time"">" + st() + st() + @"</div>
<div class=""user-gravatar32"">" + st() + @"</div>
<div class=""user-details"">" + st() + "<br/>" + st() + "</div>";
return s;
2: String.Format
string s =
@"<div class=""user-action-time"">{0}{1}</div>
<div class=""user-gravatar32"">{2}</div>
<div class=""user-details"">{3}<br/>{4}</div>";
return String.Format(s, st(), st(), st(), st(), st());
3: string.Concat
string s =
string.Concat(@"<div class=""user-action-time"">", st(), st(),
@"</div><div class=""user-gravatar32"">", st(),
@"</div><div class=""user-details"">", st(), "<br/>",
st(), "</div>");
return s;
4: String.Replace
string s =
@"<div class=""user-action-time"">{s1}{s2}</div>
<div class=""user-gravatar32"">{s3}</div>
<div class=""user-details"">{s4}<br/>{s5}</div>";
s = s.Replace("{s1}", st()).Replace("{s2}", st()).
Replace("{s3}", st()).Replace("{s4}", st()).
Replace("{s5}", st());
return s;
5: StringBuilder
var sb = new StringBuilder(256);
sb.Append(@"<div class=""user-action-time"">");
sb.Append(st());
sb.Append(st());
sb.Append(@"</div><div class=""user-gravatar32"">");
sb.Append(st());
sb.Append(@"</div><div class=""user-details"">");
sb.Append(st());
sb.Append("<br/>");
sb.Append(st());
sb.Append("</div>");
return sb.ToString();
结果是差不多:
dual core 3.5 GHz Core 2 Duo.
1: Simple Concatenation
606 ms
2: String.Format
665 ms
3: string.Concat
587 ms
4: String.Replace
979 ms
5: StringBuilder
588 ms
建议不要用 +=来拼字符串
Code时要考虑下可读性和可维护性
推荐String.Concat()这种方式,可以重载多个参数,清晰明了。然后你可以更多的考虑效率和性能。
static string Shlemiel()
{
string result = "";
for (int i = 0; i < 314159; i++)
{
result += getStringData(i);
}
return result;
}
因为,String
对两个字符串进行“+
现在我们要创建如下的html
<div class="user-action-time">stuff</div>
<div class="user-gravatar32">stuff</div>
<div class="user-details">stuff<br/>stuff</div>
假设,这段代码被用到一个网页里,而这个页面没天会被调用千万次,假设。。
那么用下面哪种方式会更快一些?
string s =
@"<div class=""user-action-time"">" + st() + st() + @"</div>
<div class=""user-gravatar32"">" + st() + @"</div>
<div class=""user-details"">" + st() + "<br/>" + st() + "</div>";
return s;
string s =
@"<div class=""user-action-time"">{0}{1}</div>
<div class=""user-gravatar32"">{2}</div>
<div class=""user-details"">{3}<br/>{4}</div>";
return String.Format(s, st(), st(), st(), st(), st());
string s =
string.Concat(@"<div class=""user-action-time"">", st(), st(),
@"</div><div class=""user-gravatar32"">", st(),
@"</div><div class=""user-details"">", st(), "<br/>",
st(), "</div>");
return s;
string s =
@"<div class=""user-action-time"">{s1}{s2}</div>
<div class=""user-gravatar32"">{s3}</div>
<div class=""user-details"">{s4}<br/>{s5}</div>";
s = s.Replace("{s1}", st()).Replace("{s2}", st()).
Replace("{s3}", st()).Replace("{s4}", st()).
Replace("{s5}", st());
return s;
var sb = new StringBuilder(256);
sb.Append(@"<div class=""user-action-time"">");
sb.Append(st());
sb.Append(st());
sb.Append(@"</div><div class=""user-gravatar32"">");
sb.Append(st());
sb.Append(@"</div><div class=""user-details"">");
sb.Append(st());
sb.Append("<br/>");
sb.Append(st());
sb.Append("</div>");
return sb.ToString();
结果是差不多:
dual core 3.5 GHz Core 2 Duo.
606 ms
665 ms
587 ms
979 ms
588 ms
建议不要用 +=来拼字符串
Code时要考虑下可读性和可维护性
推荐String.Concat()这种方式,可以重载多个参数,清晰明了。然后你可以更多的考虑效率和性能。

浙公网安备 33010602011771号