2017-08-25 12 views
-3

forループと約50,000回の反復があります。c#stringbuilder performance

Stringbuilder sb = new Stringbuilder(); 
for(int i = 0; i<50000; i++) 
    { 
     sb.Clear(); 
     sb.Append("test") //Add everytime 9 different string even from parameters 
     string s = sb.ToString(); 
} 

か、それはこのようにそれを行うには、より効率的である:

for(int i = 0; i<50000; i++) 
{ 
    Stringbuilder sb = new Stringbuilder(); 
    sb.Append("..."); //the same like above 
    string s = sb.ToString(); 
} 

だから私の質問です:それはより速く、すべての中にStringBuilderを再初期化することです はこのようにそれを行うことが、より効率的ですループを使用するか、Stringbuilder.Clear()関数を使用するより良い方法ですか? 文字列の中に9つの異なる値があるのは私の場合です。

よろしく!

+5

あなたは両方のアプローチを測定しましたかかり1 ms

  • を取りますか? –

  • +0

    Stringビルダを再初期化するのはなぜですか? StringとStringbuilderの違いは何ですか? –

    +2

    BenchmarkDotNetで試してみてください。https://github.com/dotnet/BenchmarkDotNet –

    答えて

    0

    割り振りより(少なくとも)2倍少なくなるため、最初のアプローチはより効果的です。いずれの場合も反復ごとに1つのstringインスタンスが割り当てられますが、毎回新しいStringBuilderをインスタンス化する必要はありません。

    実際には、最初の容量を手動で指定しないと(そして十分な容量を指定しない限り)、2回目の方法では繰り返しごとにさらに多くの割り当てが行われます。そうでなければ、StringBuilderは、いくつかの追加のチャンクを割り当てる必要があります(毎回その容量を2倍にする)。

    StringBuilder.Clear()を呼び出すと、現在割り当てられているチャンクはClear()でトリミング/収集されないため、次のイテレーションではすでにバッファが準備されており、「おそらく」正しいサイズになります。

    0

    私はちょうどあなたのコードをテストした:

    • 最初のループは、第二のループが3 ms