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
テストメソッド
テスト結果
テスト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();