StringBuilderはえー。 ミリ秒表示を調べるのに手こずった。 桁数揃えるのは切り捨て処理とか必要なのかな。ちょっと面倒。
class Program { static void Main(string[] args) { string Str = ""; DateTime StartDt = DateTime.Now; for(int i = 0; i< 30000; i++) { Str = Str + "ABCDEFG"; } DateTime EndDt = DateTime.Now; Console.WriteLine("String連結3万回:{0}秒",(EndDt - StartDt).TotalSeconds); StringBuilder stb = new StringBuilder(); Stopwatch Sw = new Stopwatch(); Sw.Start(); for (int i = 0; i < 300000; i++) { stb.Append("ABCDEFG"); } Sw.Stop(); double Sec = (double)Sw.ElapsedTicks / (double)Stopwatch.Frequency; Console.WriteLine("StringBulider30万回:{0}秒", Sec); // 実行結果 // String連結3万回:1.4610836秒 // StringBulider30万回:0.00474824136650194秒 } }
記事を公開したらタイマ計測方法は揃えた方がよいよとご指摘頂いた。あざます。きさとさん。
@fmty んー、時間の計り方はひとつの方法に揃えた方がいいかなと。メイン処理(string/StringBuilder)以外に実装差があると、そこでも時間差が出ているかもーと思われるので。
— きさと (@rkisato) 2015, 11月 20
ということで書き直してみた。回数も揃えた。
static void Main(string[] args) { string Str = ""; Stopwatch Sw = new Stopwatch(); Sw.Start(); for (int i = 0; i < 30000; i++) { Str = Str + "ABCDEFG"; } Sw.Stop(); double Sec1 = (double)Sw.ElapsedTicks / (double)Stopwatch.Frequency; Console.WriteLine("String連結3万回 :{0}秒", Sec1); StringBuilder stb = new StringBuilder(); Sw.Reset(); Sw.Start(); for (int i = 0; i < 30000; i++) { stb.Append("ABCDEFG"); } Sw.Stop(); double Sec2 = (double)Sw.ElapsedTicks / (double)Stopwatch.Frequency; Console.WriteLine("StringBulider3万回:{0}秒", Sec2); // 実行結果 // String連結3万回 :1.57325590253888秒 // StringBulider3万回:0.000421969408994146秒 }