2016-11-05 9 views
1

は、このようなstring.Formatを使用しています:多くのargs:stringまたはStringBuilderでstring.Formatを使用すると、よりパフォーマンスが向上しますか?

string.Format(txt, arg0, arg1, arg2, arg3, arg4,...) 

は、このように、それはそれは引数リストから新しい文字列を追加するたびに新しいオブジェクトを作成しますtxt+=args;を言うと同じですか? StringBuilder.Formatを使用する方が良いでしょうか?

+2

あなたは[あなたの馬を競う](https://ericlippert.com/2012/12/17/performance-rant/)はどうですか? – Steve

+0

これは次のようなものです: 'string st =" "; for(int i = 0; i <9000; i ++) { st + = "dop"; } 'それは速いです!悲惨なループですが、なぜですか?それは9000個のオブジェクトを作成したからです。 'StringBuilder.Format'がテストによってオブジェクトを伝播するかどうかを知る方法? –

+2

このような質問があるときは、最初に[reference source](https://referencesource.microsoft.com/#mscorlib/system/string.cs,691a34e179b91fdb)を見てください。 StringBuilderCacheは、フレームワークコードがうまくいかず、あなたの助けを必要としないことをあなたに納得させるべきです。 –

答えて

1

を上記の私のコメントは、お使いの環境であなたのパフォーマンスをテストする必要があることを意味します。 Stopwatchインスタンスを使用して、string.FormatおよびStringBuilder.AppendFormatを少なくとも100,000回実行し、Stopwatch.ElapsedMillisecondsの値を測定するループを作成します。これはおおまかにあなたに違いのアイデアを与えるでしょう。

鉱山環境では、2つのアプローチはかなり同じです。 100000ループ上の違いは、StringBuilderのために2/3ミリ秒の利点ですが、士気は次のとおりです。(あなたは絶対に明確に持っていない限り努力の結果に値するもの)

はMICROOPTIMIZATIONS

をしないでください。

サンプル:

string s1 = "Argument 1"; 
string s2 = "Argument 2"; 
string s3 = "Argument 3"; 
string s4 = "Argument 4"; 
string s5 = "Argument 5"; 
string s6 = "Argument 6"; 
string s7 = "Argument 7"; 
string s8 = "Argument 8"; 
string s9 = "Argument 9"; 

string result = string.Empty; 
object[] data = new object[] { s1, s2, s3, s4, s5, s6, s7, s8, s9 }; 
Stopwatch sw = new Stopwatch(); 
sw.Start(); 
for(int x = 0; x < 100000; x++) 
    result = string.Format("{0},{1},{2},{3},{4},{5},{6},{7},{8}", data); 
sw.Stop(); 
Console.WriteLine(sw.ElapsedMilliseconds); 

StringBuilder sb = new StringBuilder(); 
sw = new Stopwatch(); 
sw.Start(); 
for (int x = 0; x < 100000; x++) 
{ 
    sb.Length = 0; 
    sb.AppendFormat("{0},{1},{2},{3},{4},{5},{6},{7},{8}", data); 
    result = sb.ToString(); 
} 
sw.Stop(); 
Console.WriteLine(sw.ElapsedMilliseconds); 
+0

実行時に 'string + ='によって作成されたオブジェクトを見る方法はありますか? –

+1

明確ではありません。どんな物体について話していますか?文字列は不変です。したがって、+ =演算子を呼び出すたびに、変数の前の値に追加された文字列を加えた新しい文字列が作成されます。次に、新しい文字列が変数に割り当てられます。 – Steve

0

文字列形式を使用する場合は、string.Formatを使用します。 文字列や文字列フォームを大量に連結する場合は、StringBuilderを使用します。

はこれをチェックしてください: https://support.microsoft.com/en-us/kb/306822

0

String.Formatのは、その実装でのStringBuilderを使用していますので、あなたが優れている1と言うことはできません。

関連する問題