为什么StringBuilder.Replace比String.Replace慢

sin*_*ino -1 c# performance stringbuilder

根据以下单元测试方法,StringBuilder远比String.Replace慢,为什么每个人都说StringBuilder更快?我错过了什么吗?

[TestMethod]
public void StringReplace()
{
    DateTime date = DateTime.Now;
    string template = File.ReadAllText("file.txt");
    for (int i = 0; i < 100000; i++)
    {
        template = template.Replace("cat", "book" );
        template = template.Replace("book", "cat"); 
    }
    Assert.Fail((DateTime.Now - date).Milliseconds.ToString()); 
}

[TestMethod]
public void StringBuilder()
{
    DateTime date = DateTime.Now;
    StringBuilder template = new StringBuilder(File.ReadAllText("file.txt"));
    for (int i = 0; i < 100000; i++)
    {
        template.Replace("cat", "book");
        template.Replace("book", "cat"); 
    }
    Assert.Fail((DateTime.Now - date).Milliseconds.ToString());
}
Run Code Online (Sandbox Code Playgroud)

结果如下:

StringReplace - 335ms

StringBuilder - 799ms

gre*_*mac 7

StringBuilder在构建字符串方面更快.更换是一个不同的问题.

例如,以下示例代码:

    [TestMethod]
    public void StringConcat()
    {
        var start = DateTime.Now;

        var s = string.Empty;
        for (int i = 0; i < 100000; i++)
        {
            s += "cat";
        }
        Assert.Fail((DateTime.Now - start).TotalMilliseconds.ToString()); 
    }

    [TestMethod]
    public void StringBuilder()
    {
        var start = DateTime.Now;

        var sb = new StringBuilder();
        for (int i = 0; i < 100000; i++)
        { 
            sb.Append("cat");
        }
        Assert.Fail((DateTime.Now - start).TotalMilliseconds.ToString()); 
    }
Run Code Online (Sandbox Code Playgroud)

对我来说,我分别得到14,645毫秒(14.6秒)和2毫秒.