为什么 C# 中的 for 循环在连接字符串时如此缓慢?

Sha*_*yna -1 c# c++ performance for-loop

我写了一个程序,它在 C++ 和 C# 中运行一个简单的 for 循环,但在 C# 中同样的事情花费的时间要长得多,这是为什么?我在测试中没有考虑到某些事情吗?

C# (13.95s)

static double timeStamp() {
    return (double)(DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1))).TotalSeconds;
}

static void Main(string[] args) {
    double timeStart = timeStamp();

    string f = "";
    for(int i=0; i<100000; i++) {
        f += "Sample";
    }

    double timeEnd = timeStamp();
    double timeDelta = timeEnd - timeStart;
    Console.WriteLine(timeDelta.ToString());
    Console.Read();
}
Run Code Online (Sandbox Code Playgroud)

C++ (0.20s)

long int timeStampMS() {
    milliseconds ms = duration_cast<milliseconds> (system_clock::now().time_since_epoch());
    return ms.count();
}

int main() {
    long int timeBegin = timeStampMS();

    string test = "";

    for (int i = 0; i < 100000; i++) {
        test += "Sample";
    }


    long int timeEnd = timeStampMS();
    long double delta = timeEnd - timeBegin;

    cout << to_string(delta) << endl;
    cin.get();
}
Run Code Online (Sandbox Code Playgroud)

Net*_*age 5

在我的 PC 上,更改要使用的代码StringBuilderString在最后转换为 a ,执行时间从 26.15 秒变为 0.0012 秒,或者快了 20,000 多倍。

var fb = new StringBuilder();
for (int i = 0; i < 100000; ++i) {
    fb.Append("Sample");
}
var f = fb.ToString();
Run Code Online (Sandbox Code Playgroud)

正如 .Net 文档中所解释的,StringBuilder类是一个可变字符串对象,当您对字符串进行许多更改时非常有用,而不是String类,它是一个不可变对象,每次您都需要创建一个新对象将两个Strings连接在一起。由于实施StringBuilder是字符数组的链表,以及新的块加起来在同一时间8000个字符StringBuilder.Append是要快得多。