C#のStringBuilderの編集文字列初期化について

C#のStringBuilderは文字列の編集において高速に行うことができる。

これを、一旦クリアしたいときなどは、通常はClearメソッドを使うのが通常である。

しかしながら、再インスタンス化をしているコードを見つけその速度差が気になった。もともと、速度が問題視されている箇所であり、これが原因ではないかと思いClearメソッドと再インスタンス化するものとの速度比較をしてみた。

.NET4.8で計測している。

 

        static void Main(string[] args)
        {
            int loop = 10000000;
            Stopwatch sw = new Stopwatch();
            StringBuilder sb = new StringBuilder();
            GC.Collect();
            sw.Start();
            string[] st1 = new string[loop];
            for (int i = 0; i < loop; i++)
            {
                sb = new StringBuilder();
                sb.Append("hogehoge");
                sb.Append("fugafuga");
                sb.Append(i.ToString());
                sb.Append("回目のループ");
                st1[i] = sb.ToString();
            }

            sw.Stop();
            var newString = sw.ElapsedMilliseconds;
            sw.Reset();

            GC.Collect();

            string[] st2 = new string[loop];
            for (int i = 0; i < loop; i++)
            {
                sb.Clear();
                sb.Append("hogehoge");
                sb.Append("fugafuga");
                sb.Append(i.ToString());
                sb.Append("回目のループ");
                st2[i] = sb.ToString();
            }

            sw.Stop();
            var sbclear = sw.ElapsedMilliseconds;

            Console.WriteLine("new  : " + newString + "ms");
            Console.WriteLine("Clear: " + sbclear + "ms");
        }

 

 

f:id:tomo_k:20200606075833p:plain 

 

結果、このようにClearメソッドの方が圧倒的に速いという結果になった。

StringBuilderの文字列を初期化したいというだけでnewするのはやめましょう。