C#和C++中字符串操作的不同基准

Mas*_*oud 2 c# c++ string

我在C++中有两个非常简单的代码,在c#中有C#

for (int counter = 0; counter < 100000; counter ++)
{
    String a = "";
    a = "xyz";
    a = a + 'd';
    a = a + 'c';
    a = a + 'h';
}
Run Code Online (Sandbox Code Playgroud)

在c ++中

for (int counter = 0; counter < 100000; counter ++)
{
    string a = "";
    a.append("xyz");
    a = a + 'd';
    a = a + 'c';
    a = a + 'h';
}
Run Code Online (Sandbox Code Playgroud)

奇怪的是c#代码执行时间比c ++代码少1/20.你能帮我找一下为什么会这样吗?以及如何更改我的c ++代码以加快速度.

Dav*_*rtz 6

这可能是实现的一个怪癖.例如,一个优化器可能已经发现未使用操作的结果.或者有人可能碰巧分配一个足够大的字符串来添加三个额外字符而不重新分配而另一个没有重新分配.或者它可能是一百万个其他东西.

使用"玩具"代码进行基准测试确实无济于事.我不认为结果适用于任何现实情况.

这段代码有很多明显的优化,例如:

string a;
for (int counter = 0; counter < 100000; counter ++)
{
    a = "xyz";
    a.append(1, 'd');
    a.append(1, 'c');
    a.append(1, 'h');
}
Run Code Online (Sandbox Code Playgroud)

通过重用缓冲区并避免额外的分配/复制/自由循环,这可能会产生巨大的差异.