C#少量文字列リンク方法及びテスト(1)文字列と文字列

21987 ワード

文字列の接続方法
  • str1 + str2
  • $"{p}"(C#7.0新規)
  • String.Format
  • String.Concat
  • StringBuilder

  • テストメソッド
  • 各方法を使用して、2つの文字列定数と2つの文字列変数
  • をそれぞれ接続する.
  • 各方法を用いて10文字列定数
  • をそれぞれ接続する.
  • サイクル10000,000回カウント
  • 結論
  • 少量の文字列リンクを処理する場合、推奨用+読みやすさがよく、性能損失は大きくない.
  • Concatのパフォーマンスが最も優れ、$"{p}"とFormatのパフォーマンスが最も悪い.
  • 文字列定数は、コンパイル時に1つの文字列にリンクされ、文字列変数は実行時にリンクされます.
  • +を除いて、他の方法では文字列定数と変数の差が小さく、無視できます.
  • string builderは、一定数の定数または変数リンクでは優位ではありません.

  • テスト結果
    テスト1 2文字列-Plus 1:47 ms-Plus 2:697 ms-$"{p}"1:3576 ms-Format 1-1:2866 ms-Format 1-2:2753 ms-Format 2-1:3303 ms-Format 2-2:3271 ms-Concat 1:502 ms-Concat 2:423 ms-String builder 1:994 ms-String builder 2:902 ms
    テスト2文字列-Plus 1:49 ms-Plus 2:802 ms-$"{p}"1:3985 ms-Format 1-1:3016 ms-Format 1-2:2911 ms-Format 2-1:3443 ms-Format 2-2:3678 ms-Concat 1:485 ms-Concat 2:692 ms-String builder 1:1222 ms-String builder 2:1251 ms
    テスト3 10文字列-Link ten short strings-Plus 1:60 ms-Plus 2:4135 ms-$1:10524 ms-Format 1:10641 ms-Concat 1:3614 ms-String builder 1:5279 ms
    テスト4 10文字列-Link ten short strings-Plus 1:46 ms-Plus 2:3939 ms-$1:11097 ms-Format 1:10589 ms-Concat 1:3647 ms-String builder 1:5145 ms
    Code
    var str = "";
    var sw = new System.Diagnostics.Stopwatch();
    
    var s1 = "p2 i1:";
                var s2 = ", i2:";
                sw.Reset();
                sw.Start();
                for (int i = 0; i < 10000000; i++)
                {
                    str = s1 + s2;
                }
    
                sw.Stop();
                Console.WriteLine("Plus 2: " + sw.ElapsedMilliseconds.ToString() + "ms");
    
                s1 = "$1 i1:";
                sw.Reset();
                sw.Start();
                for (int i = 0; i < 10000000; i++)
                {
                    str = $"{s1}{s2}";
                }
    
                sw.Stop();
                Console.WriteLine("$ 1: " + sw.ElapsedMilliseconds.ToString() + "ms");
    
                sw.Reset();
                sw.Start();
                for (int i = 0; i < 10000000; i++)
                {
                    str = string.Format("f1 i1:{0}", ", i2:");
                }
    
                sw.Stop();
                Console.WriteLine("Format 1-1: " + sw.ElapsedMilliseconds.ToString() + "ms");
    
                sw.Reset();
                sw.Start();
                for (int i = 0; i < 10000000; i++)
                {
                    str = string.Format("f3 i1:{0}", s2);
                }
    
                sw.Stop();
                Console.WriteLine("Format 1-2: " + sw.ElapsedMilliseconds.ToString() + "ms");
    
                sw.Reset();
                sw.Start();
                for (int i = 0; i < 10000000; i++)
                {
                    str = string.Format("{0}{1}", "f2 i1:", ", i2:");
                }
    
                sw.Stop();
                Console.WriteLine("Format 2-1: " + sw.ElapsedMilliseconds.ToString() + "ms");
    
                s1 = "f4 i1:";
                sw.Reset();
                sw.Start();
                for (int i = 0; i < 10000000; i++)
                {
                    str = string.Format("{0}{1}", s1, s2);
                }
    
                sw.Stop();
                Console.WriteLine("Format 2-2: " + sw.ElapsedMilliseconds.ToString() + "ms");
    
                sw.Reset();
                sw.Start();
                for (int i = 0; i < 10000000; i++)
                {
                    str = string.Concat("c1 i1:", ", i2:");
                }
    
                sw.Stop();
                Console.WriteLine("Concat 1: " + sw.ElapsedMilliseconds.ToString() + "ms");
    
                s1 = "c2 i1:";
                sw.Reset();
                sw.Start();
                for (int i = 0; i < 10000000; i++)
                {
                    str = string.Concat(s1, s2);
                }
    
                sw.Stop();
                Console.WriteLine("Concat 2: " + sw.ElapsedMilliseconds.ToString() + "ms");
    
                sw.Reset();
                sw.Start();
                for (int i = 0; i < 10000000; i++)
                {
                    var builder = new System.Text.StringBuilder();
                    builder.Append("s1 i1:");
                    builder.Append(", i2:");
                    str = builder.ToString();
                }
    
                sw.Stop();
                Console.WriteLine("String builder 1: " + sw.ElapsedMilliseconds.ToString() + "ms");
    
                s1 = "s2 i1:";
                sw.Reset();
                sw.Start();
                for (int i = 0; i < 10000000; i++)
                {
                    var builder = new System.Text.StringBuilder();
                    builder.Append(s1);
                    builder.Append(s2);
                    str = builder.ToString();
                }
    
                sw.Stop();
                Console.WriteLine("String builder 2: " + sw.ElapsedMilliseconds.ToString() + "ms");
    
                Console.WriteLine("Link ten short strings");
                sw.Reset();
                sw.Start();
                for (int i = 0; i < 10000000; i++)
                {
                    str = "p2 i1:" + ", i2:" + ", i3:" + ",i4:" + ", i5:" + ", i6:" + ", i7:" + ", i8:" + ", i9:" + ", i10:";
                }
    
                sw.Stop();
                Console.WriteLine("Plus 1: " + sw.ElapsedMilliseconds.ToString() + "ms");
    
                s1 = "p2 i1:";
                var s3 = ", i3";
                var s4 = ", i4";
                var s5 = ", i5";
                var s6 = ", i6";
                var s7 = ", i7";
                var s8 = ", i8";
                var s9 = ", i9";
                var s10 = ", i10";
    
                sw.Reset();
                sw.Start();
                for (int i = 0; i < 10000000; i++)
                {
                    str = s1 + s2 + s3 + s4 + s5 + s6 + s7 + s8 + s9 + s10;
                }
    
                sw.Stop();
                Console.WriteLine("Plus 2: " + sw.ElapsedMilliseconds.ToString() + "ms");
    
                s1 = "$1 i1:";
                sw.Reset();
                sw.Start();
                for (int i = 0; i < 10000000; i++)
                {
                    str = $"{s1}{s2}{s3}{s4}{s5}{s6}{s7}{s8}{s9}{s10}";
                }
    
                sw.Stop();
                Console.WriteLine("$ 1: " + sw.ElapsedMilliseconds.ToString() + "ms");
    
                sw.Reset();
                sw.Start();
                for (int i = 0; i < 10000000; i++)
                {
                    str = string.Format("{0}{1}{2}{3}{4}{5}{6}{7}{8}{9}", "f2 i1:", ", i2:", ", i3:", ",i4:", ", i5:", ", i6:", ", i7:", ", i8:", ", i9:", ", i10:");
                }
    
                sw.Stop();
                Console.WriteLine("Format 1: " + sw.ElapsedMilliseconds.ToString() + "ms");
    
                sw.Reset();
                sw.Start();
                for (int i = 0; i < 10000000; i++)
                {
                    str = string.Concat("c1 i1:", ", i2:", ", i3:", ",i4:", ", i5:", ", i6:", ", i7:", ", i8:", ", i9:", ", i10:");
                }
    
                sw.Stop();
                Console.WriteLine("Concat 1: " + sw.ElapsedMilliseconds.ToString() + "ms");
    
                sw.Reset();
                sw.Start();
                for (int i = 0; i < 10000000; i++)
                {
                    var builder = new System.Text.StringBuilder();
                    builder.Append("s1 i1:");
                    builder.Append(", i2:");
                    builder.Append(", i3:");
                    builder.Append(", i4:");
                    builder.Append(", i5:");
                    builder.Append(", i6:");
                    builder.Append(", i7:");
                    builder.Append(", i8:");
                    builder.Append(", i9:");
                    builder.Append(", i10:");
                    str = builder.ToString();
                }
    
                sw.Stop();
                Console.WriteLine("String builder 1: " + sw.ElapsedMilliseconds.ToString() + "ms");
                Console.ReadKey();