StringとStringBuilderの文字列連結を比較する
.NET以降大きく変わったStringですが、ヘルプには次のように解説されています。
「Stringオブジェクトは、作成時点以降に値を変更できないことから、不変 (読み取り専用) と呼ばれます。String オブジェクトを変更するように見えるメソッドは、実際には変更内容が反映された新しい String オブジェクトを返します。」
このことから、Stringは値が変更される際、新しいインスタンスが作成されて返されることがわかります。
String以外に文字列を連結することができるクラスにStringBuilderが用意されています。 (System.Text.StringBuilder)
ここでは、インスタンスの作成や破棄がどの位の影響するのか簡単に検証してみます。
検証用結果
Count[10000]= : 00:00:00.8593750
Count[10000]= : 00:00:00
Count[100000]= : 00:03:07.1093750
Count[100000]= : 00:00:00.0468750
検証用のコード
Module Module1
Sub Main()
StringCheck()
StringBuilderCheck()
End Sub
Sub StringCheck()
Dim dtStart As DateTime = DateTime.Now
Dim strBuffer As String = String.Empty
Dim nCount As Integer = 10000
For i As Integer = 0 To nCount
strBuffer += i.ToString()
Next
Trace.Write("Count[" + nCount.ToString + "]= : " + (DateTime.Now - dtStart).ToString() + vbCrLf)
End Sub
Sub StringBuilderCheck()
Dim dtStart As DateTime = DateTime.Now
Dim sbBuffer As New Text.StringBuilder
Dim nCount As Integer = 10000
For i As Integer = 0 To nCount
sbBuffer.Append(i)
Next
Trace.Write("Count[" + nCount.ToString + "]= : " + (DateTime.Now - dtStart).ToString() + vbCrLf)
End Sub
End Module