2008/06/03(Tue) 11:00:32 編集(投稿者)
2008/06/03(Tue) 09:40:28 編集(投稿者)
前投函を盛大に勘違いしてたお詫びにサンプルを作って計測してみました。
参考になれば…
・計測内容
1. 1,000,000件x30文字の配列を作成
2. string.Join メソッドを使った連結
3. StringBuilderクラスを使った連結(キャパ指定なし)
4. StringBuilderクラスを使った連結(キャパ指定あり)
5. += を使った文字列の連結
・計測結果
1. 15ms
2. 141ms
3. 430ms
4. 137ms
5. 時間がかかりすぎ最後まで到達しなかったので1,000件毎10,000件までの計測
1000 : 120ms
2000 : 336ms
3000 : 697ms
4000 : 1291ms
5000 : 2349ms
6000 : 3679ms
7000 : 5131ms
8000 : 6877ms
9000 : 8848ms
10000 : 11109ms
・結論
お手軽 = string.Joinメソッド
速さ = StringBuilderクラス(キャパ指定あり)
・サンプルソース
//配列作成
string[] testArray = new string[1000000];
//受け取り用文字列
string resultString = "";
//計測
Stopwatch testTime = new Stopwatch();
//配列作成
testTime.Start();
for (int count = 0; count <= testArray.Length - 1; count++)
{
testArray[count] = "123456789012345678901234567890";
}
testTime.Stop();
Debug.WriteLine(string.Format("1.[{0}ms]", testTime.ElapsedMilliseconds));
testTime.Reset();
//単純にJoinで
testTime.Start();
resultString = string.Join("", testArray);
testTime.Stop();
Debug.WriteLine(string.Format("2.[{0}ms]", testTime.ElapsedMilliseconds));
testTime.Reset();
resultString = "";
//キャパ指定なし
StringBuilder stringBuilder = new StringBuilder();
testTime.Start();
for (int count = 0; count <= testArray.Length - 1; count++)
{
stringBuilder.Append(testArray[count]);
}
resultString = stringBuilder.ToString();
testTime.Stop();
Debug.WriteLine(string.Format("3.[{0}ms]", testTime.ElapsedMilliseconds));
testTime.Reset();
resultString = "";
//キャパ指定あり
stringBuilder = new StringBuilder(30000000);
testTime.Start();
for (int count = 0; count <= testArray.Length - 1; count++)
{
stringBuilder.Append(testArray[count]);
}
resultString = stringBuilder.ToString();
testTime.Stop();
Debug.WriteLine(string.Format("4.[{0}ms]", testTime.ElapsedMilliseconds));
testTime.Reset();
resultString = "";
stringBuilder = null;
//+=の場合
testTime.Start();
for (int count = 0; count <= testArray.Length - 1; count++)
{
if((count % 1000) == 0)
Debug.WriteLine(string.Format("{0} : [{1}ms]", count, testTime.ElapsedMilliseconds));
//リミッタ
if (count >= 10000) break;
resultString += testArray[count];
}
testTime.Stop();
Debug.WriteLine("End");