2

C ++には2つの非常に単純なコードがあり、C#にはC#があります。

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

C++で

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

奇妙なことに、c#コードの実行にはc++コードよりも1/20の時間がかかりました。なぜこれが起こったのかを見つけるのを手伝ってくれませんか?また、C++コードを変更して高速化するにはどうすればよいですか。

4

2 に答える 2

6

それはおそらく実装の癖です。たとえば、あるオプティマイザは、操作の結果が使用されていないことを理解した可能性があります。または、一方が再割り当てせずに3文字を追加するのに十分な大きさの文字列を割り当て、もう一方が再割り当てしない場合があります。またはそれは百万の他のものである可能性があります。

「おもちゃ」のコードでベンチマークを行うことは、実際には役に立ちません。結果が現実的な状況に当てはまるとは思いません。

このコードには、次のような多くの明らかな最適化があります。

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

これは、バッファを再利用し、余分な割り当て/コピー/解放のサイクルを回避することで、大きな違いを生む可能性があります。

于 2012-08-27T06:47:40.643 に答える
0

大きな文字列操作には、StringBuilderを使用します

于 2012-08-27T06:50:33.497 に答える