关于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()这种方式,可以重载多个参数,清晰明了。然后你可以更多的考虑效率和性能。
posted @ 2009-02-21 12:18  arengc  阅读(284)  评论(0)    收藏  举报